gpt4 book ai didi

java - 如何使用包含完全相同类型的参数但使用其他类型参数化的参数列表的方法重载方法

转载 作者:行者123 更新时间:2023-11-29 04:57:24 25 4
gpt4 key购买 nike

我有一个方法:

public List<Integer> convertBy(Function<String, List<String>> flines, Function<List<String>, String> join, Function<String, List<Integer>> collectInts) {
return collectInts.apply(join.apply(flines.apply((String) value)));
}//first method

public Integer convertBy(Function<List<String>, String> join, Function<String, List<Integer>> collectInts, Function<List<Integer>, Integer> sum) {
return sum.apply(collectInts.apply(join.apply((List<String>) value)));
}//second method

尽管它们的参数是用不同的类型参数化的,但我不能重载第一个方法。我可能会使用不同的界面,而不是 Function<T,R>但不知道哪一个就足够了,因为我浏览了它们的列表却找不到一个 https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html .

这些函数中的参数是:

flines - 从给定路径(String)读取文件并返回该文件中的行列表(List<String>)

join - 连接给定 List<String> 的元素并返回 String

collectInts - 解析给定的 String并返回在 String 中找到的整数列表.

sum - 添加来自 List<Integers> 的元素并返回总和

问题:

  1. 我可以用第二个方法重载第一个方法吗?

  2. 除了 function 之外,我还可以使用哪些现有的功能接口(interface)?我认为没有,因为论证的类型和结果总是不同的。

最佳答案

如果你想创建一个应用多个函数并且对中间值不感兴趣的方法,你可以使它成为一个泛型方法。您问题中的代码很奇怪,因为它假定 value可以是 String和一个 List<String>同时。

但与your other question相比,有不同的画面。虽然那里的可变参数方法不能那样工作,但您可以轻松地为实际用例提供重载方法:

public class InputConverter<T> {

private T value;

public InputConverter(T value) {
this.value = value;
}
public <R> R convertBy(Function<? super T, ? extends R> f) {
return f.apply(value);
}
public <T1,R> R convertBy(
Function<? super T, ? extends T1> f1, Function<? super T1, ? extends R> f2) {
return f2.apply(f1.apply(value));
}
public <T1,T2,R> R convertBy(
Function<? super T, ? extends T1> f1, Function<? super T1, ? extends T2> f2,
Function<? super T2, ? extends R> f3) {
return f3.apply(f2.apply(f1.apply(value)));
}
public <T1,T2,T3,R> R convertBy(
Function<? super T, ? extends T1> f1, Function<? super T1, ? extends T2> f2,
Function<? super T2, ? extends T3> f3, Function<? super T3, ? extends R> f4) {
return f4.apply(f3.apply(f2.apply(f1.apply(value))));
}
}

假设您按照 this answer 中的描述修复了接口(interface)类型并创建了函数, 你可以像这样使用它

InputConverter<String> fileConv=new InputConverter<>("LamComFile.txt");
List<String> lines = fileConv.convertBy(flines);
String text = fileConv.convertBy(flines, join);
List<Integer> ints = fileConv.convertBy(flines, join, collectInts);
Integer sumints = fileConv.convertBy(flines, join, collectInts, sum);

关于java - 如何使用包含完全相同类型的参数但使用其他类型参数化的参数列表的方法重载方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33256485/

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