当前位置: 首页 > 知识库问答 >
问题:

Java8如何在多个属性上获得不同列表

益光亮
2023-03-14

如何从对象列表中获得distinct(基于两个属性的distinct)列表。例如,让有一个带有属性名称和价格的对象列表。现在,我如何获得一个具有不同名称或价格的列表。
假设

list<xyz> l1 = getlist(); // getlist will return the list.
public List<xyz> getFilteredList(List<xyz> l1) {

        return l1
                .stream()
                .filter(distinctByKey(xyz::getName))
                .filter(distinctByKey(xyz::getPrice))
                .collect(Collectors.toList());
    }

    private static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
        Map<Object,Boolean> seen = new ConcurrentHashMap<>();
        return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }

然后在返回-
n1,p1的price上运行filter

这不是预期的结果。

共有1个答案

钱震博
2023-03-14

我喜欢这样的东西,它相当简单和灵活,并且建立在您的示例之上:

public static <T> List<T> distinctList(List<T> list, Function<? super T, ?>... keyExtractors) {

    return list
        .stream()
        .filter(distinctByKeys(keyExtractors))
        .collect(Collectors.toList());
}

private static <T> Predicate<T> distinctByKeys(Function<? super T, ?>... keyExtractors) {

    final Map<List<?>, Boolean> seen = new ConcurrentHashMap<>();

    return t -> {

        final List<?> keys = Arrays.stream(keyExtractors)
            .map(ke -> ke.apply(t))
            .collect(Collectors.toList());

        return seen.putIfAbsent(keys, Boolean.TRUE) == null;

    };

}

然后可以通过以下方式调用:

final List<Xyz> distinct = distinctList(list, Xyz::getName, Xyz::getPrice)
 类似资料:
  • 问题内容: 我如何使用JPA条件API执行以下操作: 使用CriteriaBuilder.countDistinct在一个列/路径上执行此操作很简单,但是如何在两个路径/列上执行此操作? 问题答案: 这是一个较晚的答案:-)尽管我不确定情况是否有所改变。 最近,我遇到了非常相同的需求,并使用concat解决了该需求,即通过将列连接为 伪列 ,然后将其连接到 伪列 上。 但是我不能使用,因为它生成了

  • 假设我有员工数据列表。 使用上面的empList,如何获得两个不同的列表,如年龄

  • 问题内容: 我正在使用jQuery流沙插件。我需要获取单击项的数据ID,并将其传递给Web服务。如何获得data- id属性?我正在使用该方法重新绑定单击事件以进行排序。 问题答案: 要获取属性的内容(如中的),您必须使用 或(如果您使用更新的jQuery> = 1.4.3) 并且后面的部分必须小写,例如将不起作用,但会起作用。

  • 在neo4j中,如何在图形上显示多个属性?例如,如果我需要显示一个人的姓名和出生年份。 当我运行此查询时,它会在neo4j浏览器中以表格格式显示数据。如果我单击图形,它会显示“没有可用的图形视图。您必须返回节点、关系或路径才能看到图形可视化。” 有什么建议吗?

  • 我有一个类具有以下签名: 我想将映射到在单个流中同时包含stringA和stringB的 或: 当然他们都不编译,但你明白了。 编辑: 示例:

  • 假设您有分层数据,并且希望获得单独属性的合并值,那么最优雅的,或者说groovy的方法是什么呢?