JAVA1.8Stream如何使用

2020-12-31 09:44发布

JAVA1.8Stream如何使用

JAVA1.8Stream如何使用

9条回答
茄子酱
2楼 · 2020-12-31 10:19

一、创建Stream对象

  1. 利用集合类的stream()方法或parallelSteam()方法创建Stream对象。

  1. 利用Stream的of()方法创建Stream对象

  1. 利用Stream的generate()和iterate()方法创建Stream对象,使用limt()方法可以限制生成元素的个数。

  1. END

二、使用Stream对象

  1. 利用foreach()方法对Stream元素进行遍历

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

  1. 利用map()方法对Stream元素进行一对一映射转换

  1. 此外Stream对象还有很多其他非常有用的方法,大家可以自己尝试,你一定会爱上Stream的。


Kindery
3楼 · 2020-12-31 10:21

利用集合类的stream()方法或parallelSteam()方法创建Stream对象。

利用Stream的of()方法创建Stream对象

利用Stream的generate()和iterate()方法创建Stream对象,使用limt()方法可以限制生成元素的个数。


是开心果呀 - 热爱生活
4楼 · 2020-12-31 10:22

JAVA从1.8版本开始就有了Stream对象,通过利用Stream可以一次性完成对多个元素的系列操作,可以规避使用for循环带来的代码高度问题。

一、创建Stream对象

利用集合类的stream()方法或parallelSteam()方法创建Stream对象。

利用Stream的of()方法创建Stream对象

利用Stream的generate()和iterate()方法创建Stream对象,使用limt()方法可以限制生成元素的个数。

二、使用Stream对象

利用foreach()方法对Stream元素进行遍历

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

利用map()方法对Stream元素进行一对一映射转换

此外Stream对象还有很多其他非常有用的方法,大家可以自己尝试,你一定会爱上Stream的。


喵喵咪
5楼 · 2020-12-31 14:10

、创建Stream对象

  1. 利用集合类的stream()方法或parallelSteam()方法创建Stream对象。


  1. 利用Stream的of()方法创建Stream对象


  1. 利用Stream的generate()和iterate()方法创建Stream对象,使用limt()方法可以限制生成元素的个数。


  1. END

二、使用Stream对象

  1. 利用foreach()方法对Stream元素进行遍历


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


  1. 利用map()方法对Stream元素进行一对一映射转换


  1. 此外Stream对象还有很多其他非常有用的方法,大家可以自己尝试,你一定会爱上Stream的。



 0人赞  添加讨论(0)

 

Kindery

3楼-- · 3小时前

利用集合类的stream()方法或parallelSteam()方法创建Stream对象。

利用Stream的of()方法创建Stream对象

利用Stream的generate()和iterate()方法创建Stream对象,使


我的网名不再改
6楼 · 2021-01-03 13:54

前言

Java1.8中引入了流的概念,具体实现是java.util.stream.Stream接口,流的性能是高效的,在多核CPU中,可以充分的的利用CPU资源,代码写起来也比常规的写法更简洁,在实际开发中,用得也比较多

我总结了一下Stream流的基本用法和常用方法,让我们来感受一下吧

基础

在使用流之前,需要准备三件事情:

  • 数据源

  • 中间操作链:用来形成流水线

  • 终端操作:用来生成最终结果

中间操作

操作返回类型说明使用场景
filterStream<T>返回一个由与此流匹配的元素组成的流过滤元素
mapStream<R>返回由应用给定结果组成的流类型转换
limitStream<T>返回一个被截断指定长度的流数据截取
sortedStream<T>返回由该流的元素组成的流,根据自然顺序排序 如果此流的元素不是Comparable,可能会引起ClassCastException异常数据排序
distinctStream<T>返回由不同元素组成的流数据去重

终端操作

操作返回类型说明使用场景
forEachvoid消费流中的每个元素并对其应用Lambda遍历元素
countlong返回流中元素的个数统计数量
collect<R> R把流规约成一个集合,可以是List、Map、Integer数据归约
anyMatchboolean流中元素任意一个满足判断条件数据判断
allMatchboolean流中元素全部满足判断条件数据判断

实战

MockData

在实际开发中,我们使用的更多的是DTO,所以新建一个类,再造些数据

@Data@AllArgsConstructorstatic class DTO {
    private String name;

    private Integer age;
    @Override
    public String toString() {
        return "(name=" + this.name + ", age=" + this.age + ")";
    }}List list = Arrays.asList(new DTO("苹果", 20), new DTO("香蕉", 35), new DTO("橘子", 15), new DTO("芒果", 50));   12345678910111213

中间操作

filter 过滤

Api:

// 返回 predicate(过滤条件) 为True的元素Stream filter(Predicate predicate);12

示例

// 过滤价格大于20的水果list.stream().filter(o -> o.getPrice() > 20).forEach(System.out::println);       12

输出如下:

(name=香蕉, price=35)
(name=芒果, price=5012

map 类型转换

Api:

 Stream map(Function mapper);IntStream mapToInt(ToIntFunction mapper);LongStream mapToLong(ToLongFunction mapper);DoubleStream mapToDouble(ToDoubleFunction mapper);1234567

类型转换的Api很多,这里只用map举例,其他Api用法大同小异,当我们要把类中的price转换成String或者其他类型的时候,可以这样

// 类型转换map(转换过程,需要有return) 将price转换成Double类型,并只返回Double类型的ageList collect = list.stream().map(o -> Double.valueOf(o.getPrice())).collect(Collectors.toList());System.out.println(collect);123

输出如下

[20.0, 35.0, 15.0, 50.0]1

limit 数据截取

Api:

Stream limit(long maxSize);1

maxSize表示返回元素的最大数量

list.stream().limit(2).forEach(System.out::println);1

输出如下

(name=苹果, price=20)
(name=香蕉, price=35)12

sorted 数据排序

Api:

// 原生排序  如果T没有实现Comparable,会引起ClassCastException异常Stream sorted();// 可以自定义排序规则  扩展性高Stream sorted(Comparator comparator);12345

先来看看原生排序,会发生异常:
java.lang.ClassCastException: xxxxxxx cannot be cast to java.lang.Comparable

// 排序List collect1 = list.stream().sorted().collect(Collectors.toList());System.out.println(collect1);123

输出如下

Exception in thread "main" java.lang.ClassCastException: com.steam.T_ForeachSteam$DTO cannot be cast to java.lang.Comparable
 at java.util.Comparators$NaturalOrderComparator.compare(Comparators.java:47)
 at java.util.TimSort.countRunAndMakeAscending(TimSort.java:355)
 at java.util.TimSort.sort(TimSort.java:220)
 at java.util.Arrays.sort(Arrays.java:1512)
 at java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:348)
 at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
 at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
 at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
 at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
 at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
 at com.steam.T_ForeachSteam.main(T_ForeachSteam.java:35)123456789101112

自定义排序

list.stream().sorted(Comparator.comparing(DTO::getPrice)).forEach(System.out::println);1

输出如下:

(name=橘子, price=15)
(name=苹果, price=20)
(name=香蕉, price=35)
(name=芒果, price=50)1234

倒序

list.stream().sorted(Comparator.comparing(DTO::getPrice).reversed()).forEach(System.out::println);1

输出如下:

(name=芒果, price=50)
(name=香蕉, price=35)
(name=苹果, price=20)
(name=橘子, price=15)1234

distinct 去重

Api:

// 底层是一个HashSet的实现Stream distinct()12
List distinctList = Arrays.asList(10, 11, 10);distinctList.stream().distinct().forEach(o -> System.out.print(o + " "));12

输出如下

10 111

终端操作

count 数据计数统计

Api:

long count();1
List anyMatchList = Arrays.asList("1","2","3","4","5");long count = anyMatchList.stream().count();System.out.println(count);123

输出如下

51

allMatch anyMatch 条件返回

Api:

boolean allMatch(Predicate predicate);1
List addList = new ArrayList<>();List anyMatchList = Arrays.asList("1","2","3","4","5");// 返回值可以理解为是否遍历了所有元素boolean b = anyMatchList.stream().allMatch(o -> {
    addList.add(o);
    // 为false时返回
    return addList.size() < 2;});System.out.println(addList.toString() + b);123456789

输出如下

[1, 2]false1

Api:

boolean allMatch(Predicate predicate);1
List addList1 = new ArrayList<>();// 返回值可以理解为是否有一个元素满足返回条件boolean any = anyMatchList.stream().anyMatch(o -> {
    addList1.add(o);
    // 为true时返回
    return addList1.size() < 2;});System.out.println(addList1.toString() + any);12345678

输出如下

[1]true1

collect 数据规约

Api:

 R collect(Collector collector); R collect(Supplier supplier,
                  BiConsumer accumulator,
                  BiConsumer combiner);12345

使用

 List list = Arrays.asList(new DTO("苹果", 20), new DTO("香蕉", 35),
         new DTO("菠萝", 20), new DTO("水蜜桃", 35),
         new DTO("橘子", 15), new DTO("芒果", 50));
 // 根据price分组
 Map> collect = list.stream().collect(Collectors.groupingBy(DTO::getPrice));
 System.out.println(JSON.toJSONString(collect));

 // 转换成set集合
 System.out.println(Stream.of("a", "b", "c","a").collect(Collectors.toSet()));
 
 // 转换成map
 Map collect1 = Stream.of("a", "b", "c", "a").collect(Collectors.toMap(x -> x, x -> x + x,(oldVal, newVal) -> newVal));
 collect1.forEach((k,v) -> System.out.println(k + ":" + v));12345678910111213

输出如下

{50:[{"name":"芒果","price":50}],35:[{"name":"香蕉","price":35},{"name":"水蜜桃","price":35}],20:[{"name":"苹果","price":20},{"name":"菠萝","price":20}],15:[{"name":"橘子","price":15}]}
[a, b, c]
a:aa
b:bb
c:cc12345


嘿呦嘿呦拔萝卜
7楼 · 2021-01-04 09:02

一、创建Stream对象

利用集合类的stream()方法或parallelSteam()方法创建Stream对象。

利用Stream的of()方法创建Stream对象

利用Stream的generate()和iterate()方法创建Stream对象,使用limt()方法可以限制生成元素的个数。

二、使用Stream对象

利用foreach()方法对Stream元素进行遍历

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

利用map()方法对Stream元素进行一对一映射转换

帅帅马
8楼 · 2021-01-04 10:11

JAVA从1.8版本开始就有了Stream对象,通过利用Stream可以一次性完成对多个元素的系列操作,可以规避使用for循环带来的代码高度问题。

一、创建Stream对象

利用集合类的stream()方法或parallelSteam()方法创建Stream对象。

利用Stream的of()方法创建Stream对象

利用Stream的generate()和iterate()方法创建Stream对象,使用limt()方法可以限制生成元素的个数。

二、使用Stream对象

利用foreach()方法对Stream元素进行遍历

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

利用map()方法对Stream元素进行一对一映射转换

此外Stream对象还有很多其他非常有用的方法,大家可以自己尝试,你一定会爱上Stream的。


xiaoxiao_123
9楼 · 2021-01-11 16:38

Stream对象是jdk8的新特征,使用步骤是三步:

  1.创建Stream对象

  2.中间过程,即是杜数据源数据进行想要的处理,其实就是调用封装好的方法,如:map(),filter()等方法。

  3.终止操作

  注意:想要使用stream,必须要有第三步,没有第三步,中间过程是不执行计算的。

 获取stream对象的方法:

    a:使用Collection中提供的stream()方法或parallelSteam()方法。

    b:  使用Stream中提供的静态of()方法

  中间过程:

     filter(): 过滤 

     limit(): 限制结果集个数

     skip():跳过结果集个数

     distinct():结果集数据去重

    ....

 终止方法:

    foreach():遍历

    count(): 返回结果集个数

  

相关问题推荐

  • 回答 156

    对于每一位才开始接触JAVA的新手来说,先不要管算法和数据结构,大多数简单的程序不需要用到算法和数据结构,所以当你真正需要时再去学习。编程一段时间以后,你就会知道在哪些地方用到他们。这时知道算法的名字并了解它们的功能,然后动手去实践。当我们在去...

  • 回答 93

    2个都很好就业,更关键的是要学得到东西

  • 回答 12
    已采纳

    获取Map集合中所有的key可以通过map集合的keySet()方法获取例如:    Map map = new HashMap();    map.put(xx,xx); //存放数据    //.... 省略    Set set = map.keySet();    //可以通过迭代器进行测试    Iterator iter = set.iter...

  • 回答 56
    已采纳

    不同年龄,不同掌握程度,学历,找工作城市,面试能力这是一个多方面影响的结果,如果是平均值的话,全国平均薪资14k左右

  • 回答 38

    具体学多久,根据自己的学习力,自律性、解决问题能力来决定若系统性学习,跟着讲师的节奏走,大概半年左右,有专业的讲师把课程进行规划,尽心系统学习,有问题,讲师会帮忙解决,学习的效率很高,避免了自学中出现各种问题解决不了,而耽误很多时间,可能会...

  • 回答 23
    已采纳

    (1)idea启动时会有两个快捷方式,安装完后默认生成在桌面的是32位的idea的快捷方式,如果我们使用这个快捷方式运行大项目,一般都会很卡。解决方法是找到idea的安装目录,然后进入bin文件夹,找到名称为idea64的应用程序,右键他生成桌面快捷方式。以后每次...

  • BIO与NIO、AIO的区别2020-05-19 15:59
    回答 4
    已采纳

    IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。一、BIO     在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要...

  • Java方法的命名规则2021-04-06 19:07
    回答 31

    ava是一种区分字母的大小写的语言,所以我们在定义变量名的时候应该注意区分大小写的使用和一些规范,接下来我们简单的来讲讲Java语言中包、类、变量等的命名规范。(一)Package(包)的命名Package的名字应该都是由一个小写单词组成,例如com、xuetang9、compan...

  • 回答 2

    public class Point {    private int x;    private int y;    public int getX() {        return x;    }    public void setX(int x) {        this.x = x;    }    public int getY() {        return y;    } ...

  • 回答 6

    经典版单例模式public class Singleton {        private static Singleton uniqueInstance;//利用一个静态常量来记录singleton类的唯一实例。     private Singleton() {     }     public static  Singleton getInstance()...

  • 回答 3

    哈希表的长度一般是定长的,在存储数据之前我们应该知道我们存储的数据规模是多大,应该尽可能地避免频繁地让哈希表扩容。但是如果设计的太大,那么就会浪费空间,因为我们跟不用不到那么大的空间来存储我们当前的数据规模;如果设计的太小,那么就会很容易发...

  • 回答 14

    1. DOM(Document Object Model)        DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才...

  • 回答 19

    1)作用不同: throw用于程序员自行产生并抛出异常; throws用于声明在该方法内抛出了异常2) 使用的位置不同: throw位于方法体内部,可以作为单独语句使用; throws必须跟在方法参数列表的后面,不能单独使用。3)内容不同: throw抛出一个异常对象,且只能是...

  • 回答 11

    基本执行过程如下:1)程序首先执行可能发生异常的try语句块。2)如果try语句没有出现异常则执行完后跳至finally语句块执行;3)如果try语句出现异常,则中断执行并根据发生的异常类型跳至相应的catch语句块执行处理。4)catch语句块可以有多个,分别捕获不同类型...

  • 回答 20

    100-199 用于指定客户端应相应的某些动作。 200-299 用于表示请求成功。 300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。 400-499 用于指出客户端的错误。 400 语义有误,当前请求无法被服务器理解。 401 当前请求需要用户验证...

  • 回答 16

    异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生。受检异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发。Java编译...

没有解决我的问题,去提问