如何提供lambda映射函数作为方法参数?

mem*_*und 3 java java-stream

可以将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(","));
}
Run Code Online (Sandbox Code Playgroud)

更新:

如果对象类型改变了怎么办?我仍然想要我的一般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
}));
Run Code Online (Sandbox Code Playgroud)

Ous*_* D. 6

用一个Function<MyObject, String>:

private String map(List<MyObject> list, Function<MyObject, String> func) {
        return list.stream().map(func).collect(Collectors.joining(","));
}
Run Code Online (Sandbox Code Playgroud)

更新:

这是一个通用的实现:

private <T> String map(List<? extends T> list,  
           Function<? super T, ? extends CharSequence> func) {
       return list.stream().map(func).collect(Collectors.joining(","));
}
Run Code Online (Sandbox Code Playgroud)