首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Collectors.reducing上市

Collectors.reducing上市
EN

Stack Overflow用户
提问于 2020-05-21 05:13:29
回答 2查看 1.2K关注 0票数 8

考虑一下这门课:

代码语言:javascript
复制
@Data
@AllArgsConstructor
@NoArgsConstructor
class User {
    String name;
    String languages;
}

我有一个List<User>,我想减少语言。输入:

代码语言:javascript
复制
List<User> list = new ArrayList<>();
list.add(new User("sam", "java"));
list.add(new User("sam", "js"));
list.add(new User("apollo", "html"));

预期产出:

代码语言:javascript
复制
[User(name=apollo, languages=html), User(name=sam, languages=java, js)]

我可以使用以下代码实现这一点:

代码语言:javascript
复制
List<User> l = list.stream()
    .collect(Collectors.groupingBy(
         u -> u.name,
         Collectors.reducing((u1, u2) -> 
             new User(u1.name, u1.languages + ", " + u2.languages))))
    .values()
    .stream()
    .filter(user -> user.get() != null)
    .map(user -> user.get())
    .collect(Collectors.toList());

System.out.println(l);

但是我不想创建两个流,这可以用一个流来实现吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-21 09:54:22

但是我不想创建两个流,这可以用一个流来实现吗?

当然,您有两个选项,在这两个选项中都必须使用Collect.collectingAndThen从创建的Map中提取正确的值类型。

您需要首先使用以下lambda表达式:

代码语言:javascript
复制
BinaryOperator<User> binaryOperator = (u1, u2) -> 
    new User(u1.getName(), String.join(", ", u1.getLanguages(), u2.getLanguages()));

解决办法:

  1. Collectors.toMapCollectors.collectingAndThen一起从Map<String, User>中提取值: 列表l= list.stream() // Stream .collect(Collectors.collectingAndThen( //地图用户::getName,// ..name作为关键用户->新用户(user.getName()),User.getLanguages(),// ..value作为用户binaryOperator),// ..combined映射->新ArrayList<>(map.values();//提取值
  2. Collectors.groupingByCollectors.collectingAndThen一起从由Collectors.reducing引起的Map<String, Optional<User>>中提取值: 列表ll = list.stream() // Stream .collect(Collectors.collectingAndThen( // Map用户)::getName,// .名为key Collectors.reducing(BinaryOperator),// .-> map.values().stream() //提取值.filter(可选:isPresent) // ..map(可选::get) // ..collect(Collectors.toList());// .创建一个列表

注意:我假设您使用爪哇-8,使用爪哇-11或更高版本可能会有不同的解决方案。

票数 0
EN

Stack Overflow用户

发布于 2020-05-21 05:19:55

您可以使用Collectors.toMap()

代码语言:javascript
复制
List<User> l = new ArrayList<> (list.stream()
    .collect(Collectors.toMap(u -> u.name,
                              u -> new User (u.name,u.languages),
                              (u1, u2) -> new User(u1.name, u1.languages + ", " + u2.languages)))
    .values());
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61927722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档