使用Java Streams通过HashSet生成整数集

时间:2018-01-16 03:59:51

标签: java collections java-8 java-stream

我试图通过获取值大于0的HashMap的所有键来创建HashSet。为此,我考虑了Java Streams,收集器的东西,但没有成功。我获得成功的唯一方法是使用带有if语句的forEach循环,如下面的代码所述:

HashMap<Integer, Double> profiencyOnSkill;
HashSet<Integer> skills;

profiencyOnSkill.put(1, 0.5);
profiencyOnSkill.put(2, 0.0);
profiencyOnSkill.put(3, 1.0);
profiencyOnSkill.put(4, 0.02);
profiencyOnSkill.put(5, 0.0);

profiencyOnSkill
            .entrySet()
            .stream()
            .forEach(pair -> {
                if (pair.getValue() > 0.0) {
                    skills.add(pair.getKey());
                }
            });

skills.forEach(System.out::println);

有没有与收藏家直接联系的方式?我对收藏家的所有想法都返回Map.Entry<Integer, Double>。这样的事情:

Set<Map.Entry<Integer, Double>> someSet = proficiencyOnSkill.entrySet().stream().filter(x-> x.getValue() == 2).collect(Collectors.toSet());

4 个答案:

答案 0 :(得分:4)

请注意,如果之后不需要原始映射,也可以执行

HashMap<Integer, Double> profiencyOnSkill = …;
profiencyOnSkill.values().removeIf(v -> v<=0);
Set<Integer> skills = profiencyOnSkill.keys();

skills.forEach(System.out::println);

答案 1 :(得分:3)

请初始化您的类型,以便您的代码可以运行。无论如何,是的,您可以filter根据您的条件map Entry.key并收集到Set

Map<Integer, Double> profiencyOnSkill = new HashMap<>();

profiencyOnSkill.put(1, 0.5);
profiencyOnSkill.put(2, 0.0);
profiencyOnSkill.put(3, 1.0);
profiencyOnSkill.put(4, 0.02);
profiencyOnSkill.put(5, 0.0);
Set<Integer> skills = profiencyOnSkill.entrySet().stream()
        .filter(pair -> pair.getValue() > 0)
        .map(Entry::getKey).collect(Collectors.toSet());

你可以(但不必)只打印skills

System.out.println(skills);

我得到了

[1, 3, 4]

答案 2 :(得分:2)

HashMap<Integer, Double> profiencyOnSkill = new HashMap<>();
HashSet<Integer> skills = new HashSet<>();

profiencyOnSkill.put(1, 0.5);
profiencyOnSkill.put(2, 0.0);
profiencyOnSkill.put(3, 1.0);
profiencyOnSkill.put(4, 0.02);
profiencyOnSkill.put(5, 0.0);

// To get both key and value
HashSet<Entry<Integer, Double>> hs = profiencyOnSkill.entrySet().stream().filter(e -> e.getValue() > 0)
        .collect(Collectors.toCollection(HashSet::new));
System.out.println(hs);

// To get only keys
skills = profiencyOnSkill.entrySet().stream()
    .filter(e -> e.getValue() > 0).map(Entry::getKey)
    .collect(Collectors.toCollection(HashSet::new));

System.out.println(skills);

答案 3 :(得分:1)

这是一个没有使用流的替代版本:

$>date -d "2018-02-21T02:22:33.221" "+%Y-%m-%dT%H:%M:%S.%3N %Z"
2018-02-20T14:22:33.221 EST

这不过是原始代码的改进版本。