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));
}
}
|