【问题标题】:Get 10 Size List<String> from Map<Long, List<String>> with Java 8 stream使用 Java 8 流从 Map<Long, List<String>> 获取 10 个大小 List<String>
【发布时间】:2021-02-26 00:47:28
【问题描述】:

有数据Set&lt;Long&gt;输入和Map&lt;Long, List&lt;String&gt;&gt;存储。

而且我想得到只有 10 个大小的列表。

Map<Long, List<String>> datas = {...{;
Set<Long> input = {....};
List<String> output = new ArrayList<>();

for(Long key : input) {
    if(output.size() >= 10) break;
    List<String> tmp = datas.get(key);
    for(String val : tmp) {
        if(output.size() >= 10) break;
        output.add(val);
    }
}

我不能在流中使用 java 9 doWhile

【问题讨论】:

    标签: lambda java-8 java-stream


    【解决方案1】:

    对应的流管道可以是

    List<String> output = input.stream()
        .flatMap(i -> datas.get(i).stream()).limit(10)
        .collect(Collectors.toList());
    

    测试:

    Map<Long, List<String>> datas = new HashMap<>();
    datas.put(1l, Arrays.asList("a", "b", "c", "d", "e", "f", "g"));
    datas.put(2l, Arrays.asList("z", "y", "x", "w", "v", "u", "t"));
    Set<Long> input = new LinkedHashSet<>(Arrays.asList(1l, 2l, 3l, 4l, 5l));
    
    System.out.println(input.stream()
            .flatMap(i -> datas.get(i).stream()).limit(10)
            .collect(Collectors.toList()));
    

    然后打印[a, b, c, d, e, f, g, z, y, x]

    【讨论】:

    • 这样写,可以循环10000次得到10个大小的List吗?
    • @EdgarHan 它没有。 limit(10) 会阻止它。测试代码(或在collect 之前添加.peek(System.out::println) 以查看查找了哪些键。如果查找了来自input 的所有键,则此代码将引发空指针异常。
    • .peek(System.out::println) limit(10) loop exec 10 次或更多次之前是否正确?
    • @ernest_k 它可能会或可能不会看到"w",这是一个实现细节。对于更新 222 之前的 Java 8 以及 Java 9,limit 之前的 peek 甚至会看到 "v""u""t"。见this Q&A。使用并行流,甚至由于在 null 上调用 stream() 而导致的异常也可能发生。靠懒惰可不是什么好主意……
    • 是的,这只是示例程序的问题;对于 OP 的任务,这种方法就足够了。
    猜你喜欢
    • 1970-01-01
    • 2019-07-31
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多