Java collect with lambda expression 示例

标签 java lambda java-stream collect

我正在尝试转换它

 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/

相关文章:

java - 如何跟踪 Android 中 RecyclerView 中的选定项目?

javascript - 多选框中的值在选择时消失

java - 我的 Java 程序没有生成 CSV 输出

java - Java 类型中的 Do while 循环

c# - 从 TDelegate 到 Expression<TDelegate> 的隐式转换在哪里声明?

java - 如何使用 Lambda 和 Streams 在 Java 8 中反转单个字符串?

c++ - Lambda 中的参数列表

c++ - std::array 和 lambda

java - 混合 Java 流 + Rxjava 安全吗

java - 如何在java 8 Stream中定义自定义排序比较器以比较键和值