Java8新特性整理之构建流的方式(四)

流的创建方式

由值创建流

你可以使用静态方法Stream.of,通过显式值创建一个流。它可以接受任意数量的参数。

Stream<String> stream = Stream.of("Java 8 ", "Lambdas ", "In ", "Action"); 
stream.map(String::toUpperCase).forEach(System.out::println); 

使用empty方法得到一个空流:

Stream<String> emptyStream = Stream.empty(); 

由数组创建流

可以使用静态方法Arrays.stream从数组创建一个流。它接受一个数组作为参数。

int[] numbers = {2, 3, 5, 7, 11, 13}; 
int sum = Arrays.stream(numbers).sum();

由集合创建流

直接使用上节的例子,menu是集合的引用:

int calories = menu.stream()
            .map(Dish::getCalories)
            .reduce(0, Integer::sum);

由文件生成流

java.nio.file.Files中的很多静态方法都会返回一个流。

@Test
public void testFileStream() {
    URI uri = null;
    try {
        uri = this.getClass().getClassLoader()
                .getResource("logstash/sms-state-info.log").toURI();
        try (Stream<String> lines = Files.lines(Paths.get(uri), Charset.defaultCharset())) {
            lines.map(String::toString)
                    .forEach(log -> {
                        System.out.println("长度 log:" + log.length());
                    });
        }
    } catch (URISyntaxException | IOException e) {
        e.printStackTrace();
    }
}

Files.lines方法,它会返回一个由指定文件中的各行构成的字符串流。

由函数生成流:创建无限流

Stream API提供了两个静态方法来从函数生成流:Stream.iterateStream.generate

这两个操作可以创建所谓的无限流:不像从固定集合创建的流那样有固定大小的流。由iterate
generate产生的流会用给定的函数按需创建值,因此可以无穷无尽地计算下去!一般来说,
应该使用limit(n)来对这种流加以限制,以避免打印无穷多个值。

Stream.iterate(0, n -> n + 2) 
      .limit(10) 
      .forEach(System.out::println); 

流的第一个元素是初始值0。然后加
上2来生成新的值2,再加上2来得到新的值4,以此类推。这种iterate操作基本上是顺序的,
因为结果取决于前一次应用。

请注意,此操作将生成一个无限流——这个流没有结尾,因为值是按需计算的,可以永远计算下去。我们说这个流是无界的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值