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

时间:2019-01-09 15:50:36

标签: 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(","));
}

更新

如果对象类型改变了怎么办?我仍然希望有一个通用的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
}));

2 个答案:

答案 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(","));
}