【问题标题】:What is the best way to get item from Set<CustomObject> into List of its attribute [closed]将项目从 Set<CustomObject> 获取到其属性列表的最佳方法是什么[关闭]
【发布时间】:2018-03-09 09:29:39
【问题描述】:

我有一个关于在Collection 中查找某些项目的问题,例如Set。

给定一个类:

private class User{
    Set<String> names = new HashSet<>();

    User(Set<String> name){
        this.names = name;
    }

    public Set<String> getNames() {
        return names;
    }
}

还有这段代码:

Set<String> firstSetInside = new HashSet<>();
firstSetInside.add("someName1");
firstSetInside.add("someName2");

Set<String> secondSetInside = new HashSet<>();
secondSetInside.add("someName1");
secondSetInside.add("someName2");

User user = new User(firstSetInside);
User user2 = new User(secondSetInside);

Set<User> userSet = new HashSet<>();
userSet.add(user);
userSet.add(user2);

如何正确地将所有名称"someNameX" 放到一个列表中?

我知道我应该使用 lambda,但如何正确使用?

【问题讨论】:

  • 请详细说明您的目标是什么。从代码中看不清楚。
  • “如何正确获取所有名称“someName2”到一个列表中”您的意思是获取名称集中包含“someName2”的所有用户?
  • 我相信问题是如何正确地将所有名称“someNameX”添加到一个列表中”,因为在代码中添加了类似的命名约定。仍然会等待如果这是答案被否决的原因,OP 会更新。
  • 是的@nullpointer,问题应该像你写的那样。非常感谢您的回答正确!
  • @ Hugo @ Joe C @ shmosel @ Eugene @Sotirios Delimanolis 任何版主能否说明问题中仍不清楚的地方。

标签: java lambda collections java-8


【解决方案1】:

要从userSet 中的所有User 中获取所有名称的具体列表,您可以使用:

List<String> allNames = new ArrayList<>();
userSet.stream().map(User::getNames).forEach(allNames::addAll);

编辑(两年半后):- 感谢一个反对者在很长一段时间后把我带回这里。这让我意识到我当时的回答是多么愚蠢。当然,处理这种情况的一个更实用的方法是使用flatMap:

List<String> allNames = userSet.stream()
                               .flatMap(user -> user.getNames().stream())
                               .collect(Collectors.toList());

【讨论】:

  • 您对 OP 试图做什么做出了未经证实的假设。你应该使用collect() 而不是forEach()。
  • collect() 适用于并行流,是生成聚合结果的更传统方式。
  • @nullpointer,当您使用 collect 时,不需要对存在于 lambda 之外的列表进行突变。但是,只要您知道自己在做什么,我认为这不足以成为拒绝投票的理由。
  • 很好,对这个问题投了反对票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
相关资源
最近更新 更多