流表示包含着一系列元素的集合,我们可以对其做不同类型的操作,用来对这些元素执行计算
二.中间流的部分应用
中间操作会再次返回一个流,所以,我们可以链接多个中间操作,注意这里是不用加分号的。
/*
Stream流中间操作方法
- 概念
中间操作的意思是,执行完此方法之后,Stream流依然可以继续执行其他操作。
- 常见方法
方法名 说明
Stream<T> filter(Predicate predicate) 用于对流中的数据进行过滤
Stream<T> limit(long maxSize) 返回此流中的元素组成的流,截取前指定参数个数的数据
Stream<T> skip(long n) 跳过指定参数个数的数据,返回由该流的剩余元素组成的流
static <T> Stream<T> concat(Stream a, Stream b) 合并a和b两个流为一个流
Stream<T> distinct() 返回由该流的不同元素(根据Object.equals(Object) )组成的流
Stream<T> sorted() 返回由此流的元素组成的流,根据自然顺序排序
Stream<T> sorted(Comparator comparator) 返回由该流的元素组成的流,根据提供的Comparator进行排序
<R> Stream<R> map(Function mapper) 返回由给定函数应用于此流的元素的结果组成的流
IntStream mapToInt(ToIntFunction mapper) 返回一个IntStream其中包含将给定函数应用于此流的元素的结果
*/
public class StreamDemo {
public static void main( String[] args ) {
List<String> list = new ArrayList<>();
list.add("孙悟空");
list.add("齐天大圣");
list.add("孙悟能");
list.add("孙源");
list.add("王孙");
System.out.println("-----------Stream<T> filter(Predicate predicate)----------------");
/*
Stream<T> filter(Predicate predicate) 用于对流中的数据进行过滤
Predicate接口:表示一个参数的谓词(布尔值函数)。
startsWith : String类中的方法;包含的意思
*/
list.stream().filter(s -> s.startsWith("孙")).forEach(System.out::println);//结果: 孙悟空 孙悟 孙源
System.out.println("-------------- Stream<T> limit(long maxSize) ------------------");
/*
Stream<T> limit(long maxSize) 返回此流中的元素组成的流,截取前指定参数个数的数据
*/
list.stream().limit(3).forEach(s -> System.out.println(s));//截取制定 的参数: 孙悟空 齐天大圣 孙悟能
System.out.println("---------------static <T> Stream<T> concat(Stream a, Stream b)-----------------");
// Stream<T> skip(long n) 跳过指定参数个数的数据,返回由该流的剩余元素组成的流
// list.stream().skip(2).forEach(System.out::println);//取2以后的所有参数 结果:孙悟能 孙源 王孙
//static <T> Stream<T> concat(Stream a, Stream b) 合并a和b两个流为一个流
Stream<String> limit = list.stream().limit(3);
Stream<String> skip = list.stream().skip(3);
Stream.concat(limit, skip).forEach(System.out::print); //孙悟空 齐天大圣 孙悟能 孙源 王孙
//Stream<T> distinct() 返回由该流的不同元素(根据Object.equals(Object) )组成的流
Stream.concat(list.stream().limit(3), list.stream().skip(2)).distinct().forEach(System.out::println);//去掉了孙悟能这个名字: 孙悟空 齐天大圣 孙悟能 孙源 王孙
System.out.println("-------Stream<T> sorted() -----------");
//Stream<T> sorted() 返回由此流的元素组成的流,根据自然顺序排序
list.stream().sorted().forEach(System.out::println);
System.out.println("-------------Stream<T> sorted(Comparator comparator)--------------------");
//Stream<T> sorted(Comparator comparator) 返回由该流的元素组成的流,根据提供的Comparator进行排序
list.stream().sorted((s1,s2)->s1.length()-s2.length()).forEach(System.out::println);//根据长度自定义排序
System.out.println("---------Stream<R> map(Function mapper) -------------");
//<R> Stream<R> map(Function mapper) 返回由给定函数应用于此流的元素的结果组成的流
list.stream().map(s -> s).forEach(System.out::println);//将String转换为String
System.out.println("-----------IntStream mapToInt(ToIntFunction mapper)------------------");
//IntStream mapToInt(ToIntFunction mapper) 返回一个IntStream其中包含将给定函数应用于此流的元素的结果
//跟map性质是一样的, 另有一个Integer求和功能sum
List<Integer> list1 = new ArrayList<>();
list1.add(100);
list1.add(111);
list1.add(211);
list1.add(311);
int sum = list1.stream().mapToInt(s -> s).sum();//求数组的和
System.out.println("数组和: "+sum);
System.out.println("-------------------求平均值----------------------");
list1.stream().mapToInt(s -> s)//将s转换为s
.average()//求平均值
.ifPresent(System.out::println);//值不为空输出
System.out.println("-----------------------Optional<T> findFirst\u200B() 返回Optional描述此流的第一个元素,或空Optional如果流是空的。----------------------------");
//Optional<T> findFirst() 返回Optional描述此流的第一个元素,或空Optional如果流是空的。
list1.stream().findFirst().ifPresent(System.out::println);
}
}
结果:
孙悟空
孙悟能
孙源
-------------- Stream<T> limit(long maxSize) ------------------
孙悟空
齐天大圣
孙悟能
---------------static <T> Stream<T> concat(Stream a, Stream b)-----------------
孙悟空齐天大圣孙悟能孙源王孙孙悟空
齐天大圣
孙悟能
孙源
王孙
-------Stream<T> sorted() -----------
孙悟空
孙悟能
孙源
王孙
齐天大圣
-------------Stream<T> sorted(Comparator comparator)--------------------
孙源
王孙
孙悟空
孙悟能
齐天大圣
---------Stream<R> map(Function mapper) -------------
孙悟空
齐天大圣
孙悟能
孙源
王孙
-----------IntStream mapToInt(ToIntFunction mapper)------------------
数组和: 733
-------------------求平均值----------------------
183.25
-----------------------Optional<T> findFirst() 返回Optional描述此流的第一个元素,或空Optional如果流是空的。----------------------------
100
Stream流终结操作方法
终端操作是对流操作的一个结束动作,一般返回 void 或者一个非流的结果。
import java.util.ArrayList;
import java.util.List;
/*
Stream流终结操作方法【应用】
- 概念
终结操作的意思是,执行完此方法之后,Stream流将不能再执行其他操作。
- 常见方法
方法名 说明
void forEach(Consumer action) 对此流的每个元素执行操作
long count() 返回此流中的元素数
*/
public class StreamDemo1 {
public static void main( String[] args ) {
List<String> arr = new ArrayList<>();
arr.add("大圣");
arr.add("齐天大圣");
arr.add("大圣2");
arr.add("大圣3");
System.out.println("---------------void forEach(Consumer action)\t对此流的每个元素执行操作---------------");
arr.stream().forEach(System.out::println);
System.out.println("--------------------long count() \t返回此流中的元素数-----------------------");
long count = arr.stream().filter(s -> s.startsWith("大")).count();
System.out.println(count);//返回第一个字包含大的有几个名字
}
}