目录标题

  • 一、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 对象为我们提供了很对操作集合的方法。具体方法的使用可以参考文档。

java stream取某个字段返回list stream获取list中的某个元素集合_子类

java stream取某个字段返回list stream获取list中的某个元素集合_java_02

二、Lambda

Lambda表达式用得最多的就是匿名子类。它可以简化匿名子类的编写。
以最常见的Runnable接口举例。

(一)什么是匿名子类

  1. 先理解匿名对象
//一般对象
String a = new String("123");

//像这个就是匿名对象(没有名字,只能使用一次)
new String("123");
//使用匿名对象
new String("123").equals("123"); //结果为ture
  1. 匿名子类(没有名字的子类)
  • 有名字的子类,名字是LambdaTest
public class LambdaTest implements Runnable {
    @Override
    public void run() {
        
    }
}
  • 匿名子类(这个类只能使用一次)
//创建了一个匿名子类,并且使用这个类new了一个匿名对象
new Runnable() {
    @Override
    public void run() {
        System.out.println("123");
    }
};

(二)Lambda表达式式

  1. 无参数
//创建一个线程
new Thread(new Runnable() {
   @Override
    public void run() {
        System.out.println("123");
    }
}).start();
//同样创建了一个线程
new Thread(()-> System.out.println("123")).start();

输出:

java stream取某个字段返回list stream获取list中的某个元素集合_子类_03

上面两个线程的功能是一致的,也就是使用Lambda表达式简写了创建线程的过程。

()-> System.out.println("123") 
等价于 
@Override
   public void run() {
       System.out.println("123");
   }
}

java stream取某个字段返回list stream获取list中的某个元素集合_子类_04

  1. 有参数
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);

java stream取某个字段返回list stream获取list中的某个元素集合_java_05

(三)总结

只要是单方法接口、抽象类。都能使用lambda表达式。在 -> 前面的是方法的参数,后面的是方法体(内容)。注意这里只是传入了一个函数(也就是一个匿名对象)。因此这个函数(方法)并不会立刻执行。它是通过匿名对象调用后才执行的。

  1. 什么是单方法接口

java stream取某个字段返回list stream获取list中的某个元素集合_System_06

  1. 匿名子类中的方法(函数)何时执行。

java stream取某个字段返回list stream获取list中的某个元素集合_匿名对象_07



  1. 继续点击init方法

java stream取某个字段返回list stream获取list中的某个元素集合_匿名对象_08


java stream取某个字段返回list stream获取list中的某个元素集合_子类_09


java stream取某个字段返回list stream获取list中的某个元素集合_System_10


这个run方法是Thread的run方法,当Threa对象调用start方法后,会调用Thread的run方法,Thread的run方法会调用我们重写的单方法接口Runnable中的run方法。

java stream取某个字段返回list stream获取list中的某个元素集合_System_11