1.Lambad表达式
(1)Lambad的作用:Lambda表达式的作用就是简化代码,省略了面向对象中类和方法的书写。
(2)Lambad的三个部分
-1- 一些参数
-2-一个箭头
-3-一段代码
标准格式
//(参数)->{一段代码}
(a)->{System.out.println(a)}
案例演示,利用线程打印1-100:
public class Test1_1 {
public static void main(String[] args) {
new Thread(() -> {
for (int i = 1; i <= 100; i++) {
System.out.println(i);
}
}).start();
}
}
(3)Lambda的前提条件
-1- 使用Lambda必须具有接口,且要求接口中的抽象方法有且仅有一个。(别的方法没有影响)
(4) 函数式接口
如果一个接口中只有一个抽象方法,那么这个接口叫做是函数式接口。
@FunctionalInterface这个注解 就表示这个接口是一个函数式接口。
2.Stream流
(1)概述
Stream用来解决之前集合的弊端。
Stream流相当于是流水线的操作,可以对一个集合进行多次操作
(2)collection集合转Stream
直接调用对象名.stream()方法
(3)Stream类型的常用方法
-
count(): 统计个数
long count = stream.count(); System.out.println(count); //流中元素的个数 5
-
forEach() :逐一处理
//打印流中的每个元素 stream.forEach((String s)->{ System.out.println(s); }); //把Lambda简化之后的写法: stream.forEach(s->System.out.println(s));
-
非终结方法:支持链式编程,可以继续调用流的其他方法。
-
filter() :过滤筛选
如果返回值是true就留下这个元素 , 如果返回值是false就过滤掉这个元素
//筛选留下所有姓张的人 stream.filter((String s)->{return s.startsWith("张");}). forEach(s->System.out.println(s)); //把Lambda简化之后的写法: stream.filter(s->s.startsWith("张")).forEach(s->System.out.println(s));
-
limit(): 取用前几个
//获取流的前三个元素 stream.limit(3).forEach(s-> System.out.println(s));
-
skip(): 跳过前几个
//跳过前三个元素获取剩余的元素 stream.skip(3).forEach(s-> System.out.println(s));
-
map() : 映射方法(把元素进行转换)
//把流中的元素换成字符串对应的长度(这就相当于是一个字符串和整数的映射) stream.map((String s)->{return s.length();}).forEach(s-> System.out.println(s)); 流中的字符串会变成整数: 3 3 2 3 2
-
concat() :组合(把两个流拼接成一个流)
//筛选出姓张的人(过滤掉了不姓张的人) //张翠山 张无忌 张三丰 张三 Stream<String> s1 = list.stream().filter(s -> s.startsWith("张")); //筛选出姓名是三个字的人中的前两个人 //张翠山 张无忌 Stream<String> s2 = list.stream().filter(s -> s.length() == 3).limit(2); //concat() :拼接(静态方法可以使用类名调用) Stream<String> ss = Stream.concat(s1, s2); //打印 ss.forEach(s-> System.out.println(s)); //上面代码可以用链式编程简化成下面写法,不过不推荐写太长: Stream.concat(list.stream().filter(s -> s.startsWith("张")), list.stream().filter(s -> s.length() == 3).limit(2)).forEach(s-> System.out.println(s));
-
(4)Stream流转集合
-
收集成List集合
-
collect(Collectors.toList());
List<String> list = s1.collect(Collectors.toList()); System.out.println("list" + list);
-
-
收集成Set集合
-
collect(Collectors.toSet());
Set<String> set = s1.collect(Collectors.toSet()); System.out.println("set" + set);
-
-
收集成数组
-
toArray(); 返回值是Object[]
Object[] arr = s1.toArray(); System.out.println(Arrays.toString(arr));
-
-
收集到Map集合
-
collect(Collectors.toMap(键的内容,值的内容));
//姓名作为键,姓名的长度作为值 s1.collect(Collectors.toMap(s->s,s->s.length()));
-
**5.Stream类对象使用中需要注意的问题
一个Stream类对象只能被调用一次方法,否则会报错。列子如下:
public class Test1_2 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
Collections.addAll(list, "cab", "bac", "acb", "cba", "bca", "abc");
Stream<String> stream = list.stream();
stream.count(); //调用一次stream
System.out.println(stream.count());//调用第二次stream 会报错!
}
}
异常信息:
Exception in thread “main” java.lang.IllegalStateException: stream has already been operated upon or closed