我正在尝试转换它
String r = "";
for ( Persona p : list ) {
r += p.lastName;
}
以stream().filter.collect()
形式,但我想知道如何用lambda表达式编写collect
(不是方法引用)。我找不到很好的例子。
这是我的
class B {
public static void main( String ... args ) {
List<Person> p = Arrays.asList(
new Person("John", "Wilson"),
new Person("Scott", "Anderson"),
new Person("Bruce", "Kent"));
String r;
String s = p.stream()
.filter( p -> p.lastName.equals("kent"))
.collect((r, p) -> r += p.lastName);/// ?????
}
}
class Person {
String name;
String lastName;
public Person( String name, String lastName ) {
this.name = name;
this.lastName = lastName;
}
}
我找到的所有示例都使用方法引用,而我认为应该有一种简单的方法来代替编写 lambda 表达式。
最佳答案
假设您不想使用任何现成的收集器,如 Collectors.joining()
,您确实可以创建自己的收集器。
但是,正如 javadoc 指出的那样,collect()期望 3 个功能接口(interface)实例作为参数,或者一个 Collector。因此,您不能只将单个 lambda 表达式传递给 collect()。
假设您想使用第一个版本,使用 3 个 lambda 表达式,您会通过阅读 javadoc 注意到结果必须是可变对象,而 String 不是可变的。所以你应该改用 StringBuilder。例如:
StringBuilder s =
p.stream()
.filter( p -> p.lastName.equals("kent"))
.map(p -> p.lastName)
.collect(StringBuilder::new,
StringBuilder::append,
StringBuilder::append);
这使用方法引用,但所有方法引用都可以写成 lambda 表达式。以上相当于
StringBuilder s =
p.stream()
.filter( p -> p.lastName.equals("kent"))
.map(p -> p.lastName)
.collect(() -> new StringBuilder(),
(stringBuilder, string) -> stringBuilder.append(string),
(stringBuilder1, stringBuilder2) -> stringBuilder1.append(stringBuilder2));
关于Java collect with lambda expression 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36462300/