JavaSE学习笔记(七)Stream流

1 概述

  • 在Java 8中,得益于Lambda所带来的函数式编程, 引入了一个全新的Stream流概念
  • 目的:用于简化集合和数组操作的API
  • Stream流核心思想
    1、先得到集合或者数组的Stream流(就是一根传送带)
    2、把元素放上去
    3、然后就用这个Stream流简化的API来方便的操作元素

2 Stream流常用方法

2.1 Stream流获取

  • 集合获取stream流的方式:可以用Collection接口中的默认方法stream()获取
名称说明
default Stream stream​()获取当前集合对象的Stream流
  • 数组获取stream流的方式:用Array静态方法stream(T[] array)或of(T… values)
名称说明
public static Stream stream(T[] array)获取当前数组的Stream流
public static Stream of(T… values)获取当前数组/可变数据的Stream流
/** --------------------Collection集合获取流-------------------   */
Collection<String> list = new ArrayList<>();
Stream<String> s =  list.stream();

/** --------------------Map集合获取流--------------------------   */
Map<String, Integer> maps = new HashMap<>();
// 键流
Stream<String> keyStream = maps.keySet().stream();
// 值流
Stream<Integer> valueStream = maps.values().stream();
// 键值对流(拿整体)
Stream<Map.Entry<String,Integer>> keyAndValueStream = maps.entrySet().stream();

/** ---------------------数组获取流----------------------------   */
String[] names = {"中国","美国","英国","法国"};
Stream<String> nameStream = Arrays.stream(names);
Stream<String> nameStream2 = Stream.of(names);

2.2 Stream流常用中间操作方法

名称说明
Stream filter(Predicate<? super T> predicate)用于对流中的数据进行过滤
Stream limit​(long maxSize)获取前几个元素
Stream skip​(long n)跳过前几个元素
Stream distinct​()去除流中重复的元素。依赖(hashCode和equals方法)
static Stream concat​(Stream a, Stream b)合并a和b两个流为一个流

中间方法也称为非终结方法,调用完成后返回新的Stream流继续使用,支持链式编程
在Stream流中无法直接修改集合、数组中的数据

List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("张大仙");
list.add("张量");
list.add("张大仙");

// Stream<T> filter(Predicate<? super T> predicate)
list.stream().filter(s -> s.startsWith("张")).forEach(s -> System.out.println(s));

long size = list.stream().filter(s -> s.length() == 3).count();
System.out.println(size);

// list.stream().filter(s -> s.startsWith("张")).limit(2).forEach(s -> System.out.println(s));
list.stream().filter(s -> s.startsWith("张")).limit(2).forEach(System.out::println);

list.stream().filter(s -> s.startsWith("张")).skip(2).forEach(System.out::println);

// map加工方法: 第一个参数原材料  -> 第二个参数是加工后的结果。
// 给集合元素的前面都加上一个:大学的:
list.stream().map(s -> "大学的:" + s).forEach(a -> System.out.println(a));

// 需求:把所有的名称 都加工成一个学生对象。
 list.stream().map(s -> new Student(s)).forEach(s -> System.out.println(s));
// list.stream().map(Student::new).forEach(System.out::println); // 构造器引用  方法引用

// 合并流。
Stream<String> s1 = list.stream().filter(s -> s.startsWith("张"));
Stream<String> s2 = Stream.of("java1", "java2");
// public static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)
Stream<String> s3 = Stream.concat(s1 , s2);
s3.distinct().forEach(s -> System.out.println(s));
  • 比较两个自定义对象的大小需自定义比较方法
list.stream().max((e1, e2) -> Double.compare(e1.getWeight(),  e2.getWeight())).map(e -> new TopWeightApple(e.getName(),  e.getWeight()));
list.stream().sorted((e1, e2) -> Double.compare(e1.getWeight(),  e2.getWeight())).skip(1).limit(one.size() - 2).forEach(System.out::println);

2.3 Stream流常用终结方法

名称说明
void forEach​(Consumer action)对此流的每个元素执行遍历操作
long count​()返回此流中的元素数
  • 注意:终结操作方法,调用完成后流就无法继续使用了,原因是不会返回Stream流

3 Stream流收集

  • 收集Stream流的含义:就是把Stream流操作后的结果数据转回到集合或者数组中去
    • Stream流:方便操作集合/数组的手段
    • 集合/数组:才是开发中的目的
名称说明
R collect​(Collector collector)开始收集Stream流,指定收集器
具体收集方式说明
public static Collector toList​()把元素收集到List集合中
public static Collector toSet​()把元素收集到Set集合中
public static Collector toMap​(Function keyMapper , Function valueMapper)把元素收集到Map集合中
Stream<String> s1 = list.stream().filter(s -> s.startsWith("张"));
List<String> zhangList = s1.collect(Collectors.toList()); // 可变集合
Set<String> zhangSet = s2.collect(Collectors.toSet()); // 可变集合
List<String> list1 = s1.toList(); // 得到不可变集合
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值