我试图通过获取值大于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());
答案 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
这不过是原始代码的改进版本。