首页 > 编程语言 >Java中的 Stream 流02

Java中的 Stream 流02

时间:2023-04-04 21:04:53浏览次数:42  
标签:02 Java Stream stream list System println 操作

1、流的创建

1.1、 使用集合对象的 stream() 方法创建流

  • 数组对象,创建流时需要使用 Arrays.stream() 方法;
  • 集合类对象,可以在对象后直接使用 .stream() 方法转换为流;
  • Map 对象不能直接转换为流,但是可以对 Map 对象中的 key 、 value、 entrySet 分别转换为流方便后续使用。
//数组对象
int[] ints = new int[]{1,3,5,7,11};
IntStream stream = Arrays.stream(ints);

//List对象转换为流
List<Integer> nums = Arrays.asList(6,9,15,32,48);
Stream<Integer> stream1 = nums.stream();

//Map对象
Map<String, String> map = new Hashtable<>();
map.put("one", "first");
map.put("two", "second");
Stream<String> keys = map.keySet().stream();
Stream<String> values = map.values().stream();
Stream<Map.Entry<String, String>> stream3 = map.entrySet().stream();
复制代码

1.2、 使用 Stream.of() 方法创建流

对于数组来说,还可以通过 Stream.of() 方法转换为流

Stream<Integer> ints1 = Stream.of(1,3,5,7,11);
复制代码

对于其他非数组的对象来说,这种方式,可能会将问题变得复杂,不如第一种简便。

2、流的中间操作

中间操作: 中间操作会返回一个新的流,一个流的后面可以跟随零个或多个其他中间操作,成为一个操作链。

中间操作的主要目的是打开流,做出某种数据映射或者过滤,然后会返回一个新的流,交给下一个操作使用。

这类操作都是惰性化的,仅仅调用到这类方法,并没有真正开始流的遍历。而是在执行到结束操作开始的时候才真正开始执行。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Stream1 {
    public static void main(String[] args) {
        List<Integer> nums = Arrays.asList(6,9,15,32,48);
        //filter() 返回结果生成新的流中只包含满足筛选条件的数据
        List<Integer> results = nums.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());
        System.out.println(results);
    }
}
复制代码

输出结果:

[6, 32, 48]

示例中:

  • stream() 是创建操作,通过该操作可以将集合对象转换为流;
  • filter() 是中间操作,在这里的作用是从列表中过滤出能被2整除的数据后,生成新的流;
  • collect() 是结束操作,这里是将前边生成的新流收集成为一个新的列表。

2.1、filter 操作

filter 是 Stream 流中的常用方法,主要用于对 Stream 流中的数据进行过滤,便于对过滤后的流进行后续其他操作。 filter 方法的参数 Predicate 是一个函数式接口,所以可以传递 Lambda 表达式,对数据进行操作。

筛选出列表中内容包含字母 a 的元素并输出:

@Test
public void testFilter(){
    Stream<String> stream = Stream.of("lisi", "zhangsan", "wangwu");
    stream.filter(name -> name.contains("a")).forEach(System.out::println);
}
复制代码

输出结果如下:

zhangsan

wangwu

2.2、sorted 操作

Stream的sorted()排序,能够以自然顺序或者用 Comparator 接口定义的排序规则来排序一个流,Comparator 能用 lambda 表达式来初始化,还能够逆序一个已经排序的流。

@Test
public void testSorted(){
    List<String> list = Arrays.asList("lisi", "zhangsan", "wangwu", "anhui");
    System.out.println("==========正序排序");
    list.stream().sorted().forEach(System.out::println);
    System.out.println("==========倒序排序");
    list.stream().sorted(Comparator.reverseOrder()).forEach(System.out::println);
}
复制代码

在倒序排序时,使用了 Comparator.reverseOrder() 静态方法,对流进行了翻转。 输出结果:

==========正序排序

anhui

lisi

wangwu

zhangsan

==========倒序排序

zhangsan

wangwu

lisi

anhui

2.3、 limit 操作

用于截取流中的元素,limit方法可以对流进行截取,只取用前n个。

对列表元素正序排序后,取出前两个元素。

@Test
public void testLimit(){
    List<String> list = Arrays.asList("lisi", "zhangsan", "wangwu", "anhui");
    list.stream().sorted().limit(2).forEach(System.out::println);
}
复制代码

输出结果:

anhui

lisi

2.4、 distinct 操作

Stream流中的 distinct 方法用于去除流中的重复元素。

Stream流的 distinct 方法如果要对自定义对象去重,定义的对象需要实现hashcode()和 equals()方法。

@Test
public void testLimit(){
    List<String> list = Arrays.asList("lisi", "zhangsan", "lisi", "anhui");
    list.stream().distinct().forEach(System.out::println);
}
复制代码

输出结果:

lisi

zhangsan

anhui

2.5、 skip 操作

用于跳过元素,如果希望跳过前几个元素,可以使用skip方法获取一个截取之后的新流。

对流中的元素排序后,取出除第一个元素外的其它元素:

@Test
public void testLimit(){
    List<String> list = Arrays.asList("lisi", "zhangsan", "wangwu", "anhui");
    list.stream().sorted().skip(1).forEach(System.out::println);
}
复制代码

输出结果:

lisi

wangwu

zhangsan


标签:02,Java,Stream,stream,list,System,println,操作
From: https://blog.51cto.com/u_113754/6169517

相关文章

  • flask框架02 cbv分析 模板 请求与响应 session 闪现 请求拓展
    今日内容详细目录今日内容详细1cbv分析1.1源码分析2模板2.1py文件2.2html页面3请求与响应4session及源码分析4.1session的使用4.2源码分析5闪现6请求拓展1cbv分析#基于类的视图,写法fromflaskimportFlask,requestfromflask.viewsimportView,MethodView......
  • 美团面试题目以及解答20200424
    一面:集合有哪些:List(ArrayList Linklist)set(SetTreesetHashset)map(HashmapcurrentHashmaphashtable)arraylist和linkedlist区别一个是基于数组的实现一个是基于的链表的实现hashmap怎么扩容(多线程扩容为什么会死循环),put过程出现的是链表的闭环。concurrentHashMap1.7和1.......
  • 基础_002_常量
    一、数值常量1、常见数值常量   65535、37         //十进制整型,默认   012、-023         //八进制整型,0开头,每一位只能0~7   0x3a、0X22F       //十六进制整型,0x或0X开头,每一位只能0~9或A~F   123u、46U         //无符号整......
  • Mac | 解决 MacOS 配置 Maven 出现的 Java_Home Error
    1.错误信息2.解决方案2.1对于Windows系统下解决方案https://blog.csdn.net/frankarmstrong/article/details/69945774,在MacOS下并不奏效2.2对于MacOS系统下的解决方案code~/.bash_profile#使用VSCode打开环境变量文件#配置Java_Home内容exportJAVA_HOME=$......
  • java -- Object类和String类
    Object类java.lang.Object类是Java语言中的根类,每个类都使用Object作为超类,所有的类都直接或间接继承自Object类。所有对象(包括数组)都实现这个类的方法。native本地方法在Object类的源码中定义了native修饰的方法,native修饰的方法称为本地方法。特点被native修饰的方......
  • Java基础(四)
    网络编程网络编程概述:计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络编程操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统网络编程在网络通信协议下,实现网络互联的不同......
  • 2023GPLT选拔题解
    看到没有题解我就给大家浅浅的写一篇吧,如果有错误,希望大家可以帮我指出来哦,创作不易,如果大家给个关注,点个赞就更好了  1:著名开源操作系统Linux的核心创始人Linus有一句经典名言:”Talkischeap.Showmethecode.“ 说出这句话时是2000年8月25日,那天有人在Linus的Linu......
  • java之NIO简介
    一、NIO基本简介NIO (NewlO)也有人称之为javanon-blockinglO是从Java1.4版本开始引入的一个新的IOAPI,可以替代标准的JavalOAPI。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操......
  • 【游记】SDOI2023 游记
    3.25-3.26来到南京啦,跟着号爸度过这最后的一个星期,刚来的第一天,天上就下冰雹,震惊。但是这两天莫名其妙跟了两天普及组,甚至让我对号爸的实力产生了怀疑。3.27巨佬\(3h\)切掉APIOT3和USACO铂金组T3,只能膜膜膜。晚上我爸竟然抓到了一位NOIP2022SDrk10-的大佬,和大佬......
  • 2023年4月4日
    打起精神,斗志昂扬计划做PPT理清项目背景,需求,功能,整理到ppt上不研究新东西,管理员端,重点看项目结构,看懂某一个功能如何实现,例如新增接口执行09点35分  读书《Spring+SpringMVC+MyBatis从零开始学》先11点06分  CRM视频记录已解决解决找回密码界面等的邮件发送......