使用Java流过滤器按属性名称过滤重复项

时间:2019-08-22 06:01:46

标签: java lambda java-8 java-stream

如何使用Java流通过相同的属性来过滤对象?

哈希集 tasks包含:

task=1, name=hello
task=2, name=hello

(我不想在“名称”上使用equals / hashcode)

现在,我要过滤tasks,以产生具有唯一HashSet属性的新name

所有具有相同名称的对象应视为相等:

tasks.stream.filter(???);

我可以通过创建一个新列表并通过索引下一个元素并查找name(如果它已经放入列表中)来查找2个for循环来解决该问题。但是,也许有一个班轮可以解决这些问题?也许和stream.filter()在一起?

3 个答案:

答案 0 :(得分:3)

您可以首先使用任务名称作为键并使用相关Task作为值来创建映射。仅使用mergeFunction即可忽略重复的任务。然后以Set视图的形式获取所有不同的任务。

Set<Task> distinctTasks = tasks.stream().collect(Collectors.collectingAndThen(
    Collectors.toMap(Task::getName, Function.identity(), 
        (a, b) -> a), m -> new HashSet<>(m.values())));

答案 1 :(得分:0)

我找到一种解决方案:

List<Task> tasksDistinct = tasks.stream()
                    .collect(Collectors.groupingBy(Task::getName))
                    .values()
                    .stream()
                    .flatMap(m -> m.stream())
                    .collect(Collectors.toList());

有没有更好的解决方案?

答案 2 :(得分:0)

您可以这样做

Set<String> set = tasks.stream()
                  .map(Task::getName)
                  .collect(Collectors.toCollection(HashSet::new));