【问题标题】:How to use Intstream and map method如何使用 Intstream 和 map 方法
【发布时间】:2019-01-06 23:49:13
【问题描述】:

我已经解决了Java书上的问题,还有一些问题。

在下面的代码中,我想通过使用 map 中间操作将每个元素加倍来创建一个新流。我想打印一个新流来获取生成流中除小于 50 的数字之外的所有元素的总和。

我该如何解决这个问题??

    package test;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;
import java.util.Optional;
import java.util.stream.IntStream;

public class tt {


public static void main(String[] args) {
    try {
        Stream <String> lines = Files.lines(Paths.get("C:\\Users\\wonheelee\\eclipse-workspace\\test\\stream-data.txt"));


        IntStream IS = lines.mapToInt(Integer::valueOf);

        IS.forEach(System.out::println);
        lines.close();

    } catch (IOException e) {
       // No action 
    }
}
}

【问题讨论】:

    标签: java java-stream


    【解决方案1】:

    给你..

    int result = lines
                .mapToInt(Integer::parseInt)
                .map(element -> element * 2) //Double
                .filter(element -> element >= 50) //Filter out values less than 50
                .sum(); //sum
    

    您可以将mapToIntmap 组合成一个mapToInt 本身

    .mapToInt(element -> Integer.parseInt(element) * 2)
    

    另外,请注意 cmets 中提到的 Aomine@,使用 Integer.parseInt 以避免额外的装箱/拆箱。


    我不太清楚你所说的创建一个新流是什么意思。再次拨打Files.lines即可获得新的Stream。

    一旦 Stream 已被使用,您将无法重复使用它。

    参考:

    Is there any way to reuse a Stream?

    【讨论】:

    • 为了更好的可读性,我会先运行filter,然后使用映射函数将相关整数加倍。
    • @Aris 你不能不加倍过滤它们。无论如何,我会将 .mapToInt(Integer::valueOf) 更改为 .mapToInt(Integer::parseInt) 以避免装箱和拆箱值。
    • 当然可以。您需要先将它们映射到 int mapToInt 过滤映射和转换的整数,然后使用加倍操作再次映射,最后应用 sum 终端操作。
    • @Aris 我的理解是OP想先加倍然后过滤。如果你先过滤,那么你就不会得到前任的数字,比如 26。
    • 聪明人的@Aomine:.mapToInt(Integer::parseInt).filter(a -&gt; a &gt;= 25).sum()*2 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 2022-06-10
    • 2021-05-14
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    相关资源
    最近更新 更多