我有一个方法:
^CTraceback (most recent call last):
File "./tcpSynmultiprocess.py", line 43, in <module>
results = [output.get() for p in processes]
File "/usr/lib/python2.7/multiprocessing/queues.py", line 117, in get
res = self._recv()
尽管它们的参数化是用不同的类型进行参数化的,但我不能重载第一种方法。除了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
之外,我可能会使用不同的界面,但是当我浏览它们列表并且找不到https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html时,我不知道哪一个就足够了。
这些功能中的参数是:
Function<T,R>
- 从给定路径(flines
)读取文件并返回该文件中的行列表(String
)
List<String>
- 连接给定join
的元素并返回List<String>
String
- 解析给定的collectInts
并返回String
中找到的整数列表。
String
- 添加sum
的元素并返回总和
问题:
我可以通过第二个方法重载第一个方法吗?
除了功能之外我还可以使用哪些其他现有的功能界面?我认为没有,因为论证和结果的类型总是不同的。
答案 0 :(得分:3)
如果要创建应用多个函数且对中间值不感兴趣的方法,可以将其作为通用方法。您的问题中的代码很奇怪,因为它假定value
可以同时为String
和List<String>
。
但与your other question相比,情况有所不同。虽然varargs方法无法以这种方式工作,但您可以轻松地为实际用例提供重载方法:
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中的说明修改了界面类型并创建了函数,您可以像
一样使用它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);