标签: java-stream

按 LocalDateTime 对流中的地图进行排序

我有地图Map<LocalDateTime, String>。

如何按键值对其进行排序?我应该使用什么比较器?

someMap.entrySet().stream().sorted(Comparator.comparing(???))
Run Code Online (Sandbox Code Playgroud)

或者

someMap.entrySet().stream().sorted(??)
Run Code Online (Sandbox Code Playgroud)

我该如何解决?我应该写什么来代替“??” ?

排序:

Key                      Value
2020-01-09 09:57:58.631  Some info
2020-01-09 09:57:59.224  Some info
2020-01-09 09:59:03.144  Info
Run Code Online (Sandbox Code Playgroud)

不排序:

Key                     Value
2020-01-09 09:57:58.631  Some info
2020-01-09 09:59:03.144  Info
2020-01-09 09:57:59.224  Some info
Run Code Online (Sandbox Code Playgroud)

java sorting java-8 java-stream java-time

1
推荐指数
1
解决办法
201
查看次数

如何使用流java获取列表中列表中元素的大小

我正在寻找使用流在列表中的列表中的项目数量的最简单方法。这是示例:

public class ObjectA {
    private List<ObjectB> objectBList;
}

public class ObjectB {
    private List<long> idList;


}
Run Code Online (Sandbox Code Playgroud)

我有一个 ObjectA 的列表。我想找出ObjectB我在列表中的数量。这是我能想到的最简单的形式:

long count = 0;
List<ObjectA> objectAList = getListObjectA();
for (ObjectA objectA : objectAList) {
    count += objectA.getObjectBList().size();
}
Run Code Online (Sandbox Code Playgroud)

是否有比使用流更简单的格式?我将不得不遍历列表中的每个元素并获得第二个列表的大小。

java list java-stream

1
推荐指数
1
解决办法
89
查看次数

使用 Java 流的排序算法

有一个随机顺序的字符串货币 ISO 代码列表:CHF、USD、AUD、EUR、0995、AED...等。

是否有一种算法可以按以下顺序对其进行排序:首先应该只使用主要货币(美元、瑞士法郎、欧元)——完全按照这个顺序,然后按字母顺序排列所有其他货币,然后是所有数字货币代码?

到目前为止,我通过简单地创建 3 个单独的列表,对它们进行相应排序,然后制作 list.addAll 来分 3 个步骤来完成。将不胜感激任何帮助

sorting algorithm java-stream

1
推荐指数
1
解决办法
50
查看次数

如何将字符串拆分为映射,使用流按重复键对值进行分组?

我想转换以下内容

String flString="view1:filedname11,view1:filedname12,view2:fieldname21";
Run Code Online (Sandbox Code Playgroud)

到 aMap<String,Set<String>>获取键/值如下:

view1=[filedname11,filedname12]
view2=[fieldname21]
Run Code Online (Sandbox Code Playgroud)

我想使用 Java 8 流。我试过

view1=[filedname11,filedname12]
view2=[fieldname21]
Run Code Online (Sandbox Code Playgroud)

然而,键也被添加到值列表中。

java string key-value java-8 java-stream

1
推荐指数
1
解决办法
392
查看次数

使用流按 List&lt;String&gt; 对 Map&lt;String, Integer&gt; 进行排序

Map<String, Integer> nonOrderedData = // {b=1, c=2, d=3, e=4, a=0}
List<String> orderSequence = // a, b, c, d, e
Run Code Online (Sandbox Code Playgroud)

我需要应用顺序序列来获取正确排序的数据,我如何使用(首选)流实现这一点?

我使用的是非流方式:

Map<String, Integer> orderedData = new HashMap<>();
for (Map.Entry<String, Integer> nod : nonOrderedData.entrySet()) {
    for (String os : orderSequence) {
        if (os == nod.getKey()) {
            // add nonOrderedData data
        } else {
            // add data by sequence
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

想要更清洁的方式来实现我想要的。


我注意到在我的方法中我可以只返回new TreeMap<>(nonOrderedData)并且它会工作得很好,但我不想坚持只应用 asc 顺序 - 我想读取实际序列值然后更改nonOrderedData.

java sorting collections treemap java-stream

1
推荐指数
1
解决办法
117
查看次数

带有单个过滤器的奇数和偶数?

我最近遇到了一个面试问题,要求我从List. 唯一的问题是我不能使用如下 2 个过滤器:

List<Integer> nums = Arrays.asList(1,2,3,4,5);
        
List<Integer> odd = nums.stream().filter(n -> n%2 != 0).collect(Collectors.toList());
        
List<Integer> even = nums.stream().filter(n -> n%2 == 0).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

我说这是不可能的,因为最终collect方法只能返回 1 个列表。

我错过了什么?

java java-8 java-stream

1
推荐指数
1
解决办法
402
查看次数

在将 java steam 应用到列表之前对列表进行空检查

我有以下代码

item.getSubCategory().stream().map(category -> {
              return subCategoriesList.add(new SubCategoryViewModel(
                      category.get(String.format("_%s",categoryProperties[0])).toString(),
                      category.get(categoryProperties[2]).toString(),
                      category.get(categoryProperties[3]).toString()));
            }).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

这item.getSubCategory()是一个类别模型列表。现在,如果 null 出现在getSubCategory我们会得到一个空指针异常并且不能对其应用蒸汽。在将流应用于列表之前,是否有更好的方法来处理对列表的空检查。

我不想使用IF语句来检查getSubCategory. java steam API 有没有更好的方法?

java java-8 java-stream

1
推荐指数
1
解决办法
254
查看次数

Java - 收集消费者?

有没有一种功能性的方法来首先收集流的元素,然后立即将集合传递给消费者?换句话说,一种在将所有流元素作为集合而不是一个接一个地应用终端操作之前等待流结束的构造?

例如,您是否可以将以下内容实现为单行:

Stream<Event> stream = // a stream of events
List<Event> list = stream.collect(Collectors.toList());
doProcessEvents(list);
Run Code Online (Sandbox Code Playgroud)

作为一种解决方法,我可以 (ab) 使用Collectors.collectingAndThen()和 aFunction来实现我正在寻找的结果:

Function<List<Event>, Void> processingFunction = (list -> {
    doProcessEvents(list);
    return null;
});

Stream<Event> stream = // a stream of events
stream.collect(Collectors.collectingAndThen(Collectors.toList(), processingFunction);
Run Code Online (Sandbox Code Playgroud)

我考虑过的其他替代方案(但不起作用)是如果该collectingAndThen()方法有一个Consumer作为第二个参数,例如,Collectors.collectingAndThen(Collector downstream, Consumer consumer)或者如果Consumer接口有一个finish()在流中的最后一个元素被消耗后执行的方法:

class EventConsumer implements Consumer<Event> {
    private final List<Event> list = new LinkedList<>();

    @Override
    public void accept(Event ev) {
        events.add(ev);
    }

    public void …
Run Code Online (Sandbox Code Playgroud)

java java-stream functional-interface

1
推荐指数
1
解决办法
122
查看次数

Java 流有条件地添加多个值

我有一个像这样的对象列表,其中数量可以是负数或正数:

class Sale {
   String country;
   BigDecimal amount;
}
Run Code Online (Sandbox Code Playgroud)

我想最终得到一对所有负值和所有正值的总和,按国家/地区分类。

使用这些值:

country | amount
nl      | 9
nl      | -3
be      | 7.9
be      | -7
Run Code Online (Sandbox Code Playgroud)

有没有办法最终Map<String, Pair<BigDecimal, BigDecimal>>使用单个流?

使用两个单独的流很容易做到这一点,但我无法仅用一个流来解决。

java bigdecimal java-stream

1
推荐指数
1
解决办法
106
查看次数

Collectors.groupingBy 功能和对字段求和

.collect(Collectors.groupingBy(Point::getName, Collectors.summingInt(Point::getCount)));
Run Code Online (Sandbox Code Playgroud)

我有一个Point对象列表,我想按某个键(name字段)分组并按count该类的字段求和。上面的代码完成了这项工作,但返回了一个Point对象映射。但是,我想要Point返回的对象列表-而不是 map。

使用 java 8 流执行此操作的最干净方法是什么?

例子:

input = [pt("jack", 1), pt("jack", 1), pt("jack", 1)]

result = [pt("jack", 3)]
Run Code Online (Sandbox Code Playgroud)

谢谢

java java-8 java-stream

1
推荐指数
1
解决办法
115
查看次数