gpt4 book ai didi

java - 如何将具有多个覆盖的 valueOf 方法作为参数传递给方法

转载 作者:行者123 更新时间:2023-12-04 02:25:45 26 4
gpt4 key购买 nike

我有兴趣编写一个通用的 split 方法,它可以像这样调用:

List<String> names = splitField("John, Nate, Larry", String::valueOf);
List<Integer> ages = splitField("35, 23, 48", Integer::valueOf);

这是我的实现:

private <T, R> List<R> splitField(String stringWithComma, Function<T, R> valueOf) {
List<R> elements = new ArrayList<>();
if (stringWithComma != null && !stringWithComma.isEmpty()) {
elements = Arrays.stream(stringWithComma.split(","))
.map(valueOf)
.collect(Collectors.toList());
}
return elements;
}

它没有构建,我在这里缺少什么?

谢谢!

编辑 1:

此实现构建并运行良好,使用 String::valueOf 调用,但在 Integer::valueOf 上调用时抛出异常

private <R> List<R> splitField(String elementsWithComma, Function<String, R> valueOf) {
List<R> elements = new ArrayList<>();
if (elementsWithComma != null && !elementsWithComma.isEmpty()) {
elements = Arrays.stream(elementsWithComma.split(","))
.map(valueOf)
.collect(Collectors.toList());
}
return elements;
}

最佳答案

你正在声明一个类型参数 T你真正想要的地方 String ,因为该函数应该处理一个您知道为 String 的值至 R .删除类型参数 T并将函数更改为 Function<String, R> .

private <R> List<R> splitField(String stringWithComma, Function<String, R> valueOf) {
List<R> elements = new ArrayList<>();
if (stringWithComma != null && !stringWithComma.isEmpty()) {
elements = Arrays.stream(stringWithComma.split(",\\s*"))
.map(valueOf)
.collect(Collectors.toList());
}
return elements;
}

请注意,我还更改了拆分模式,让它占用逗号后的空间,以避免解析异常。

PECS 之后规则,您可以放宽函数签名,以支持更多用例。

private <R> List<R> splitField(
String stringWithComma, Function<? super String, ? extends R> valueOf) {
List<R> elements = new ArrayList<>();
if (stringWithComma != null && !stringWithComma.isEmpty()) {
elements = Arrays.stream(stringWithComma.split(",\\s*"))
.map(valueOf)
.collect(Collectors.toList());
}
return elements;
}

关于java - 如何将具有多个覆盖的 valueOf 方法作为参数传递给方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67839206/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com