如何使用Java流通过相同的属性来过滤对象?
哈希集 tasks
包含:
task=1, name=hello
task=2, name=hello
(我不想在“名称”上使用equals / hashcode)
现在,我要过滤tasks
,以产生具有唯一HashSet
属性的新name
。
所有具有相同名称的对象应视为相等:
tasks.stream.filter(???);
我可以通过创建一个新列表并通过索引下一个元素并查找name
(如果它已经放入列表中)来查找2个for循环来解决该问题。但是,也许有一个班轮可以解决这些问题?也许和stream.filter()
在一起?
答案 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));