是否可以将lambda表达式作为函数参数传递?示例如下:我想传递从列表项中提取属性的“策略”。不必重复一遍又一遍的流映射。
List<MyObject> list;
list.stream().map(item -> item.field1)).collector(Collectors.joining(","));
list.stream().map(item -> item.field2)).collector(Collectors.joining(","));
list.stream().map(item -> {
//some complex parser function
})).collector(Collectors.joining(","));
...
//pseudocode
private String map(List<MyObject> list, Function func) {
return list.stream.map(item -> func.call()).collector(Collectors.joining(","));
}
更新:
如果对象类型改变了怎么办?我仍然希望有一个通用的map()
方法来定义提取字段的收集。但是随着对象类型的变化,我只想提供一个知道如何提取所需属性的函数。
class Person {
String name;
}
class Car {
String manufacture;
}
map(persons, (person) -> person.name));
map(cars, (car) -> car.manufacture));
map(cars, (MyObject) -> {
//more complex parsing
}));
答案 0 :(得分:6)
使用Function<MyObject, String>
:
private String map(List<MyObject> list, Function<MyObject, String> func) {
return list.stream().map(func).collect(Collectors.joining(","));
}
更新:
这是一个通用实现:
private <T> String map(List<? extends T> list,
Function<? super T, ? extends CharSequence> func) {
return list.stream().map(func).collect(Collectors.joining(","));
}
答案 1 :(得分:2)
如果对象类型改变了怎么办?我仍然想拥有我的一般map() 定义提取字段的收集的方法。
您主要是在这里寻找通用方法:
private <T> String map(List<T> list, Function<T, String> func) {
return list.stream().map(func).collect(Collectors.joining(","));
}