目录
5. Steam流
5.1 什么是Steam流
在JDK 8中提供了Stream API,把真正的函数式编程风格引入到Java中,它可以极大提供Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
Stream是JDK 8中处理集合的关键抽象概念,它可以指定你希望对进行的操作,可以执非常复杂查找、过滤和映射数据等。使用
Stream APl对集合数据进行操作,就类似于使用SQL执行的数据库查询。也可以使用Stream API来并行执行操作。简而言之,StreamAPI提供了一种高效且易于使用的处理数据的方式。5.2 为什么要去使用Steam流
可以极大的简化开发
5.3 什么是Steam流
Stream是数据渠道,用于操作数据源(如:集合、数组等)所生成的元素序列。特别注意:集合是数据,Stream是计算
注意:
- 1.Stream 不会存储元素
- 2.Stream 不会改变源对象,而是返回一个持有结果的新Stream
- 3.Stream 操作是延迟执行的,这意味着它们会等到需要结果时才执行
5.4 Stream流使用步骤
通过以下几个步骤来完成:
- 1.创建Stream:一个数据源(如:集合、数组),获取一个流
- 2.中间操作:一个中间操作链,对数据源的数据进行处理
- 3.终止操作:一旦执行终止操作,就执行中间操作链,并产生结果,之后不会再被使用
5.5 创建Steam流的方法
以下3种方式来创建:
- 通过Collection的stream 默认方法获取
- 通过Stream接口的静态方法of 获取
- 通过Arrays中的stream 获取
- 创建无限流 使用Stream.iterate() 或者 Stream.generate()
5.6 终止操作
当一个Stream方法执行之后,返回的结果不是Stream类型的时候,该操作为终止操作
终止操作会消费流,会产生一个结果
如果一个Stream流被消费之后,这个Stream流就不用重新使用
5.6.1 迭代
迭代流中的数据使用方法是forEach()方法
public class StreamForEachDemo1 { /** * Stream 终止操作中的迭代方法,使用forEach()方法 * @param args */ public static void main(String[] args) { List<String> list = new ArrayList<>(); Collections.addAll(list,"Java ","C ","C++ ","Python ","Go "); list.stream().forEach(System.out::print); } }
5.6.2 匹配
判断数据是否匹配指定的条件,使用Match相关的方法,返回值类型为boolean
方法名 描述 allMatch(Predicate p) 全部元素满足条件,则返回true,否则返回false anyMatch(Predicate p) 只要有一个满足条件,则返回true;
全部元素不满足条件返回false
noneMatch(Predicate p) 全部元素不满足条件,则返回true,否则返回false public class StreamMatchDemo { @Test public void testAllmatch() { Stream<Integer> stream = Stream.of(1,2,7,8,9,11); /** * 判断所有元素 是否 都大于0 * 只要有一个元素不符合条件,就返回false * 必修全部元素都符合条件,才能返回true */ Boolean result1 = stream.allMatch(s -> s>0); System.out.println("result1:" + result1); //result1:true } @Test public void testAnymatch() { Stream<Integer> stream = Stream.of(1,2,7,8,9,11); /** * 判断所有元素 是否 都大于10 * 只要有一个元素符合条件,就返回true * 必修全部元素都不符合条件,才能返回false */ Boolean result2 = stream.anyMatch(s -> s>10); System.out.println("result2:" + result2); //result2:false } @Test public void testNoneMatch() { Stream<Integer> stream = Stream.of(1,2,7,8,9,11); /** * 判断所有元素 是否 都大于10 * 全部元素,不满足条件,就返回true * 否则,返回false */ Boolean result3 = stream.noneMatch(s -> s>10); System.out.println("result3:" + result3); //result3:false } }
5.6.3 查找
找到某些数据,使用find相关的方法,返回类型为Optional<T>
方法名 描述 findFirst() 返回找到的第一个元素 findAny() 返回当前流中的任意元素
/** * 终止操作 中的 查找 使用find相关的方法 * 1.findFirst 用于查找第一个匹配的元素 * 2.findAny 用于在流中查找能匹配的元素 一般用于并行流 * */ public class StreamFindDemo { @Test public void testFindFirst() { Stream<Integer> numbers = Stream.of(444,45,2,3,45,6,8,77,99); Optional<Integer> numbersFirst = numbers.findFirst(); System.out.println(numbersFirst); //Optional[444] System.out.println(numbersFirst.get()); //444 } @Test public void testFinfAny() { Stream<Integer> numbers = Stream.of(666,45,2,3,45,6,8,77,99); Optional<Integer> numbersAny = numbers.findAny(); System.out.println(numbersAny); //Optional[666] System.out.println(numbersAny.get()); //666 } }
5.6.4 统计
方法名 描述 count() 返回流中元素的总数 max(Comparator c) 返回流中的最大值 min(Comparator c) 返回流中的最小值 /** * Stream流终止查找 中 统计 * 1.count :返回流中元素的总数 * 2.max(Comparator c) :返回流中的最大值 * 3.min(Comparator c) :返回流中的最小值 */ public class StreamMaxAndMinDemo { @Test public void testCount() { Stream<Integer> numbers = Stream.of(1,2,3,4,5,6,7,8,9,100); long count = numbers.count(); System.out.println(count); //10 } @Test public void testMax() { Stream<Integer> numbers = Stream.of(1,2,3,4,5,6,7,8,9,100); Optional<Integer> max = numbers.max(Integer::compareTo); System.out.println(max); //Optional[100] System.out.println(max.get()); //100 } @Test public void testMin() { Stream<Integer> numbers = Stream.of(1,2,3,4,5,6,7,8,9,100); Optional<Integer> min = numbers.min(Integer::compareTo); System.out.println(min); //Optional[1] System.out.println(min.get()); //1 } }
本章节未完结,待更新!
感谢支持