关于java8的stream的信息

博主:adminadmin 2023-01-03 09:21:07 1200

本篇文章给大家谈谈java8的stream,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Java8 新特性 stream().map 能不能跳过元素 ,相当于continue的作用?

你好,很高兴回答你的问题。

stream()可以调用filter方法,可以用来过滤只保留符合条件的数据,相当于是循环到不符合条件的数据时continue。

如果有帮助到你请点击采纳。

用Java 8 增加的 Stream API 能实现哪些优雅的算法

Java 8引入了全新的Stream API。这里的Stream和I/O流不同,它更像具有Iterable的集合类,但行为和集合类又有所不同。

Stream API引入的目的在于弥补Java函数式编程的缺陷。对于很多支持函数式编程的语言,map()、reduce()基本上都内置到语言的标准库中了,不过,Java 8的Stream API总体来讲仍然是非常完善和强大,足以用很少的代码完成许多复杂的功能。

创建一个Stream有很多方法,最简单的方法是把一个Collection变成Stream。我们来看最基本的几个操作:

public static void main(String[] args) {

ListInteger numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

StreamInteger stream = numbers.stream();

stream.filter((x) - {

return x % 2 == 0;

}).map((x) - {

return x * x;

}).forEach(System.out::println);

}

集合类新增的stream()方法用于把一个集合变成Stream,然后,通过filter()、map()等实现Stream的变换。Stream还有一个forEach()来完成每个元素的迭代。

为什么不在集合类实现这些操作,而是定义了全新的Stream API?Oracle官方给出了几个重要原因:

一是集合类持有的所有元素都是存储在内存中的,非常巨大的集合类会占用大量的内存,而Stream的元素却是在访问的时候才被计算出来,这种“延迟计算”的特性有点类似Clojure的lazy-seq,占用内存很少。

二是集合类的迭代逻辑是调用者负责,通常是for循环,而Stream的迭代是隐含在对Stream的各种操作中,例如map()。

要理解“延迟计算”,不妨创建一个无穷大小的Stream。

如果要表示自然数集合,显然用集合类是不可能实现的,因为自然数有无穷多个。但是Stream可以做到。

自然数集合的规则非常简单,每个元素都是前一个元素的值+1,因此,自然数发生器用代码实现如下:

class NaturalSupplier implements SupplierLong {

long value = 0;

public Long get() {

this.value = this.value + 1;

return this.value;

}

}

反复调用get(),将得到一个无穷数列,利用这个Supplier,可以创建一个无穷的Stream:

public static void main(String[] args) {

StreamLong natural = Stream.generate(new NaturalSupplier());

natural.map((x) - {

return x * x;

}).limit(10).forEach(System.out::println);

}

对这个Stream做任何map()、filter()等操作都是完全可以的,这说明Stream API对Stream进行转换并生成一个新的Stream并非实时计算,而是做了延迟计算。

当然,对这个无穷的Stream不能直接调用forEach(),这样会无限打印下去。但是我们可以利用limit()变换,把这个无穷Stream变换为有限的Stream。

利用Stream API,可以设计更加简单的数据接口。例如,生成斐波那契数列,完全可以用一个无穷流表示(受限Java的long型大小,可以改为BigInteger):

class FibonacciSupplier implements SupplierLong {

long a = 0;

long b = 1;

@Override

public Long get() {

long x = a + b;

a = b;

b = x;

return a;

}

}

public class FibonacciStream {

public static void main(String[] args) {

StreamLong fibonacci = Stream.generate(new FibonacciSupplier());

fibonacci.limit(10).forEach(System.out::println);

}

}

如果想取得数列的前10项,用limit(10),如果想取得数列的第20~30项,用:

ListLong list = fibonacci.skip(20).limit(10).collect(Collectors.toList());

最后通过collect()方法把Stream变为List。该List存储的所有元素就已经是计算出的确定的元素了。

用Stream表示Fibonacci数列,其接口比任何其他接口定义都要来得简单灵活并且高效。

Java8 新特性中的Stream,如何按照条件替换原来stream中的数据?

1、首先利用foreach()方法对Stream元素进行遍历,如下图所示。

2、利用filter()方法对Stream元素进行过滤,其中x - x 5为Lambda表达式,作为filter的参数。执行过滤后满足过滤条件的Stream元素将会保留。

3、利用map()方法对Stream元素进行一对一映射转换,如下图所示。

4、此外Stream对象还有很多其他非常有用的方法,可以自己尝试,如下图所示就完成了。

Java8 Stream有没有提供多重条件执行

先回答题主问题,木有...

Java8的流Stream在我理解来说,是提供了一种操作数据的一种流程...类似生产流水线...感觉是让我们逐步把以前命令式的代码风格融入一些声明式的风格,要解决这个问题,是不是可以转换哈思考方式,既然题主想用Stream来解决,那何不用Stream的方式来思考

就像刚才说到的,Stream是类似生产流水线式的...那想想生产流水线上,比如可乐生产流水线,先处理可乐罐,清洗,灌装可乐,订上可乐拉环等等,这每一步操作,应该是没有什么特殊情况来特殊处理吧,每罐可乐都是一样的处理的,这才是生产流水线

同理Stream也是一样...这回要处理的是Stream里的数据,先贴代码(一些set,get方法,构造方法省略了)

java8中如何将多个集合的数据拼接成一个统一的流

java8中stream的提供了一个拼接流的方法Stream.concat,可以将两个stream拼接成一个stream, 保持了两个stream中的元素顺序。

那么如果我们需要对多个集合中的元素拼接成一个stream来统一处理,可以怎么做呢?

比如有三个CollectionString c1, c2, c3.

方法一,使用Stream.concat方法来拼接,可以使用一个for循环来处理。

private static StreamString concat1(ListCollectionString collections) {

Stream result = Stream.empty();

for (CollectionString strings : collections) {

              result = Stream.concat(result,  strings.stream());

}

return   result;

}

方法二,使用flatMap方法,将集合变成stream, 再压平

private static StreamString concat2(ListCollectionString collections) {

return  collections.stream()

           .flatMap(Collection::stream);

}

对于不同集合类型的数据,如何做成一个统一的流?还是可以使用flatMap方法来做

方法三:

private static StreamString concat3(ListString s1,String[] s2, SetString s3) {

return  Stream.of(s1.stream(), Arrays.stream(s2), s3.stream())

           .flatMap(Function.identity());

}

方法三和方法二相比,可以使用不同类型的集合类型来拼接流,方法二在拥有共同基类的情况下使用会显得简洁很多。

java8提供的stream有什么用处

1. 创建Stream; 2. 转换Stream,每次转换原有Stream对象不改变,返回一个新的Stream对象(**可以有多次转换**); 3. 对Stream进行聚合(Reduce)操作,获取想要的结果;

关于java8的stream和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。