首页 > 解决方案 > 结合使用 java 流的操作

问题描述

我正在做以下两个操作

  1. 遍历对象列表并String, Boolean根据条件创建映射。
        Map<String,Boolean> myMap = new HashMap<>();
        Iterator<Person> iterator = personList.iterator();
            while (iterator.hasNext()) {
                Person person = iterator.next();
                if (isValidperson(person)) {
                    if (person.getName() != null) {
                        myMap.put(person.getName(), true);
                    } else {
                        myMap.put(person.getName(), false);
                    }
                }
            }

现在我根据我在上面创建的地图检查名称列表,如果值为真,则添加到最终列表

            List<String> refinedList = new ArrayList<>();
            for (String name : nameList) {
                if (myMap.get(name) != null && myMap.get(name)) {
                    refinedList.add(name);
                }
            }

我需要使用 Java 流来简化逻辑。上述工作正常,否则。

标签: javajava-8java-stream

解决方案


在第一个操作中,您将过滤掉所有无效人员,并将有效人员收集到地图中,因此:

Map<String,Boolean> myMap = personList.stream()
    .filter(YourClass::isValidPerson)
    .collect(Collectors.toMap(x -> x.getName(), x -> x.getName() != null))

但实际上,地图最多只有一个false条目,因为您不能将多个nulls 添加到 aHashMap中,所以使用 a 根本没有多大意义HashMap

我建议使用HashSet

Set<String> mySet = personList.stream()
    .filter(YourClass::isValidPerson)
    .map(Person::getName)
    .filter(Objects::nonNull)
    .collect(Collectors.toSet())

然后您可以轻松地检查containsO(1) 时间:

List<String> refinedList = nameList.stream().filter(mySet::contains).collect(Collectors.toList());

推荐阅读