目录标题
- 一、stream
- (一)获取对象
- (二)操作方法
- 二、Lambda
- (一)什么是匿名子类
- (二)Lambda表达式式
- (三)总结
一、stream
可用理解stream流也是一个集合,利用流(这个集合)的方法可以处理集合里面元素。比如:选出集合中最大的元素【max()】、统计集合有多少个元素【count()】、过滤掉一些元素【filter()】等。
(一)获取对象
获取stream对象有一下几种方法
//1. 调用Arrays的方法静态方法stream()
String[] arr = {"1", "2", "3","c","c"};
Stream<String> stream = Arrays.stream(arr);
//2.直接获取,注意Stream是一个接口,of()方法是一个接口里面有方法体的方法
Stream<String> stream1 = Stream.of("a", "b", "c");
// 3. Map,获取entrySet调用stream方法
Map<Integer, String> map = new HashMap<>();
map.put(1, "a");
map.put(2, "b");
map.put(3, "c");
Stream<Map.Entry<Integer, String>> stream2 = map.entrySet().stream();
//4.获取文件的stream流
try {
Stream lines = Files.lines(Paths.get("文件路径名"), Charset.defaultCharset());
} catch (IOException e) {
e.printStackTrace();
}
(二)操作方法
有了对象之后就能调用方法。
stream 对象为我们提供了很对操作集合的方法。具体方法的使用可以参考文档。
二、Lambda
Lambda表达式用得最多的就是匿名子类。它可以简化匿名子类的编写。
以最常见的Runnable接口举例。
(一)什么是匿名子类
- 先理解匿名对象
//一般对象
String a = new String("123");
//像这个就是匿名对象(没有名字,只能使用一次)
new String("123");
//使用匿名对象
new String("123").equals("123"); //结果为ture
- 匿名子类(没有名字的子类)
- 有名字的子类,名字是LambdaTest
public class LambdaTest implements Runnable {
@Override
public void run() {
}
}
- 匿名子类(这个类只能使用一次)
//创建了一个匿名子类,并且使用这个类new了一个匿名对象
new Runnable() {
@Override
public void run() {
System.out.println("123");
}
};
(二)Lambda表达式式
- 无参数
//创建一个线程
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("123");
}
}).start();
//同样创建了一个线程
new Thread(()-> System.out.println("123")).start();
输出:
上面两个线程的功能是一致的,也就是使用Lambda表达式简写了创建线程的过程。
()-> System.out.println("123")
等价于
@Override
public void run() {
System.out.println("123");
}
}
- 有参数
long c = Arrays.stream(arr).filter(a -> {
return a.equals("c");
}).count();
System.out.println(c);
long c1 = Arrays.stream(arr).filter(new Predicate<String>() {
@Override
public boolean test(String s) {
return s.equals("c");
}
}).count();
System.out.println(c1);
(三)总结
只要是单方法接口、抽象类。都能使用lambda表达式。在 -> 前面的是方法的参数,后面的是方法体(内容)。注意这里只是传入了一个函数(也就是一个匿名对象)。因此这个函数(方法)并不会立刻执行。它是通过匿名对象调用后才执行的。
- 什么是单方法接口
- 匿名子类中的方法(函数)何时执行。
继续点击init方法
这个run方法是Thread的run方法,当Threa对象调用start方法后,会调用Thread的run方法,Thread的run方法会调用我们重写的单方法接口Runnable中的run方法。