1.Stream流的常用方法:
终结方法:返回值类型不再是Stream接口本身类型的方法,例如:forEach方法和count方法
非终结方法/延迟方法:返回值类型仍然是Stream接口自身类型的方法,除了终结方法都是延迟方法。例如:filter,limit,skip,map,concat
方法名 方法的作用 方法的种类 是否支持链式调用
count 统计个数 终结 否
foEach 逐一处理 终结 否
filter 过滤 函数拼接 是
limit 取用前几个 函数拼接 是
skip 跳过前几个 函数拼接 是
map 映射 函数拼接 是
concat 组合 函数拼接 是
2.count方法:
long count(); 统计流中的元素,返回long类型数据
public class Tests_count {
public static void main(String[] args) {
/*
* count方法:
* long count(); 统计流中的元素,返回long类型数据
*
* */
// 创建List集合
List<String> list = new ArrayList<>();
list.add("张三");
list.add("张三四");
list.add("王五");
list.add("赵六");
list.add("张三三");
list.add("周八");
long count = list.stream().count();
System.out.println("流中的属于个数:"+count);
}
}
3.forEach
forEach方法:
void forEach(Consumer<? super T> action):逐一处理流中的元素
参数 Consumer<? super T> action : 函数式接口, 只有一个抽象方法:void accept(T t);
注意:
1.此方法并不保证元素的逐一消费动作在流中是有序执行的
2.Consumer 是一个消费接口(可以获取流中的元素进行遍历操作,输出出去),可以使用lambda表达式
public class Tests_forEach {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张三");
list.add("张三四");
list.add("王五");
list.add("赵六");
list.add("张三三");
list.add("周八");
// 函数模型:获取流 --> 逐一消费流中的元素
list.stream().forEach((String name)->{
System.out.println(name);
});
/*
* 虽然方法名称叫做【forEach】,但是与for循环中的【for-each】昵称不同,该方法并不保证元素的逐一消费动作在流中是被有序执行的
* */
System.out.println("==========================");
// parallelStream()方法可以得到并行流
list.parallelStream().forEach((String name)->{
System.out.println(name);
});
}
}
4.filter方法
Stream<T> filter(Predicate<? super T> predicate); 过滤出满足条件的元素
参数Predicate:函数式接口,抽象方法:boolean test(T t);
Predicate接口:是一个判断接口
public class Tests_filter {
public static void main(String[] args) {
// 获取stream流
Stream<String> stream = Stream.of("张三", "张三四", "王五", "赵六", "张三三", "周八");
// 需求:过滤处
stream.filter((String name)->{
return name.startsWith("张");
}).forEach((String name)->{
System.out.println(name);
});
}
}
5.limit方法
Stream<T>
注意:
参数是一个long类型,如果流的但钱长度大于参数则进行截取;否则不进行操作
public class Tests_limit {
public static void main(String[] args) {
// 获取stream流
Stream<String> stream = Stream.of("张三", "张三四", "王五", "赵六", "张三三", "周八");
// 需求:保留前3个元素
stream.limit(3).forEach((String name) -> {
System.out.println(name);
});
System.out.println("===========================");
// 如果流的获取长度 大于 流当前的长度,则不操作
stream.limit(10).forEach(name-> System.out.println(name)); // 异常: stream has already
// been operated upon or closed 流已被操作或关闭
Stream<String> stream1 = Stream.of("张三", "张三四", "王五", "赵六", "张三三", "周八");
stream1.limit(10).forEach(name-> System.out.println(name));
}
}
6.skip方法:
Stream<T> skip(long n); 跳过前几个元素
注意:
如果流的当前长度大于 n,则跳过前n个,否则将会得到一个长度为0的空流
public class Tests_skip {
public static void main(String[] args) {
// 获取stream流
Stream<String> stream = Stream.of("张三", "张三四", "王五", "赵六", "张三三", "周八");
// 需求:跳过前3个
stream.skip(3).forEach(name-> System.out.println(name));
}
}
7.map方法
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
参数 Function<T,R>:函数式接口,抽象方法: R apply(T t);
Function<T,R>:其实就是一个类型转换接口(T和R的类型可以一致,也可以不一致)
public class Tests_map {
public static void main(String[] args) {
// 获取stream流
Stream<String> stream1 = Stream.of("11", "22", "33", "44", "55");
// 需求:把stream1流中的元素转换为int类型
stream1.map((String s)-> Integer.parseInt(s)).forEach((Integer i)->System.out.println(i));
// 需求:把stream2流中的元素转换为String类型
Stream<String> stream2 = Stream.of("11", "22", "33", "44", "55");
stream2.map((String s) ->
{return s+""; // 将流中的String类型的元素进行加工,拼接操作,返回String类型的元素的流
}).forEach(s -> {
System.out.println(s);}); // 将流中的String类型元素逐一输出
}
}
8.concat方法
public static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)
--> 合并两个流
public class Tests_concat {
public static void main(String[] args) {
Stream<String> stream1 = Stream.of("张三", "张三四", "王五", "赵六", "张三三", "周八");
Stream<String> stream2 = Stream.of("11", "22", "33", "44", "55");
// 需求:合并两个流
Stream<String> concat = Stream.concat(stream1, stream2);
concat.forEach(name-> System.out.println(name));
}
}
9.收集Stream流
Stream流中提供了一个方法,可以把流中的数据手机到单列集合中:
<R, A> R collect(Collector<? super T, A, R> collector); 把流中的数据手机到单列集合中
返回值类型是R。R指定为什么类型,就是手机到什么类型的集合
参数Collector<? super T, A, R>中的R类型,决定把流中的元素收集到哪个集合中
参数Collector如何得到 ?,可以使用 java.util.stream.Collectors工具类中的静态方法:
- public static <T> Collector<T, ?, List<T>> toList():转换为List集合
- public static <T> Collector<T, ?, Set<T>> toSet() :转换为Set集合
public class Tests {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张三");
list.add("张三四");
list.add("王五");
list.add("赵六");
list.add("张三三");
list.add("周八");
// 需求:过滤出姓张的并且长度为3的元素
Stream<String> stream1 = list.stream().filter(name -> name.startsWith("张")).filter(name -> name.length() == 3);
// stream 收集到单列集合中
List<String> list1 = stream1.collect(Collectors.toList());
System.out.println(list1);
// stream 手机到单列集合中
Set<String> set1 = stream1.collect(Collectors.toSet());
System.out.println(set1);
}
}
Stream流中一个方法
Object[] toArray(); 返回一个包含此流的元素的数组
public class Tests2 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张三");
list.add("张三四");
list.add("王五");
list.add("赵六");
list.add("张三三");
list.add("周八");
Stream<String> stream = list.stream().filter(name -> name.length() == 3).filter(name -> name.startsWith("张"));
// 将stream流中的元素转成Array数组对象
Object[] arr = stream.toArray();
System.out.println(Arrays.toString(arr));
}
}