如何使用Java流从一组对象中提取不同整数的排序列表?

时间:2018-10-26 08:44:04

标签: java

我有一组值对象:

Set<EntityKey> clientAssignedPlaceholderEntityKeys

EntityKey类具有以下属性:

private Integer objectRef;
private String entityType;

使用流将不同的objectRef值提取到排序列表中的最有效方法是什么?

我有以下内容,但它两次调用stream()的事实似乎是一种难闻的气味:

  // Extract into a sorted list all the distinct placeholder objectRefs (regardless of type).
  List<Integer> sortedPlaceholderObjectRefs = clientAssignedPlaceholderEntityKeys.stream()
          .map(entityKey -> entityKey.getObjectRef())
          .collect(Collectors.toSet())
          .stream()  // having to call stream() a 2nd time here feels sub-optimal
          .sorted()
          .collect(Collectors.toList());

3 个答案:

答案 0 :(得分:4)

也许:

sortedPlaceholderObjectRefs = clientAssignedPlaceholderEntityKeys.stream()
                      .map(entityKey -> entityKey.getObjectRef())
                      .sorted()
                      .distinct()
                      .collect(Collectors.toList());

编辑:

.distinct()之前致电.sorted()可能更合适

答案 1 :(得分:2)

List<Integer> sortedRefs = clientAssignedPlaceholderEntityKeys
                      .stream()
                      .map(EntityKey::getObjectRef)
                      .distinct()
                      .sorted()
                      .collect(Collectors.toList());

答案 2 :(得分:2)

      clientAssignedPlaceholderEntityKeys.stream()
                                         .map(ek -> ek.getObjectRef())
                                         .sorted()
                                         .distinct()
                                         .collect(Collectors.toList());

关于您对 sorted() distinct()

的顺序的疑问

引用here的第一个答案: 在 sorted()之后链接 distinct()操作,该实现将利用数据的排序性质,并避免构建内部HashSet。