java8 Lambda表达式

Lambda表达式 当需要启动一个线程去完成任务时,代码量太多了,只有run方法体才是关键。jdk8就加入了lambda表达式。 public class Demo01Runnable { public static void main(String[] args) { // 匿名内部类 Runnable task = new Runnable() { @Override public void run() { // 覆盖重写抽象方法 System.out.println("多线程任务执行!"); } }; new Thread(task).start(); // 启动线程 } }   简化的lambda表达式:new Thread(() ‐> System.out.println("多线程任务执行!")).start(); // 启动线程 1.有且仅有一个抽象方法的接口,称为“函数式接口,使用Lambda必须具有上下文推断。也就是方法的参数或方法的返回值类型是一个函数式接口,才能使用Lambda作为该接口的实例。 2.lambda表达式格式 (参数类型 参数名称) ‐> { 代码语句 }
  • 1. 小括号内参数的类型可以省略;
  • 2. 如果小括号内有且仅有一个参,则小括号可以省略;
  • 3. 如果大括号内有且仅有一个语句,则无论是否有返回值,都可以省略大括号、return关键字及语句分号。
3.@FunctionalInterface注解,用于一个接口的定义,一旦使用该注解来定义接口,编译器将会强制检查该接口是否确实有且仅有一个抽象方法,否则将会报错。需要注意的是,即使不使用该注解,只要满足函数式接口的定义,这仍然是一个函数式接口   @FunctionalInterface public interface MyFunctionalInterface { void myMethod(); } 注意:lambda表达式中访问的局部变量是final的,      因为实例变量存在堆中,而局部变量是在栈上分配,Lambda 表达(匿名类) 会在另一个线程中执行。如果在线程中要直接访问一个局部变量,可能线程执行时该局部变量已经被销毁了,而 final 类型的局部变量在 Lambda 表达式(匿名类) 中其实是局部变量的一个拷贝。   int b = 3;         System.out.println(testFunction((String i) -> b+1+Integer.valueOf(i),"3")); //        b =5; 如果加上这个,编译就会报错,在jdk8中局部变量没有显示定义成final,他也会编译成final的。     4.常用函数式接口 java8 Lambda表达式java8 Lambda表达式 例子:   private static void consumeString(String s,Consumer<String> function) {     function.accept(s); } public static void main(String[] args) {     consumeString("zhouyang",(s) -> {         System.out.println("消费了一个数据:"+s);     }); 其他接口 java8 Lambda表达式java8 Lambda表达式 5.方法引用 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!(实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致!)方法引用:使用操作符 “::” 将方法名和对象或类的名字分隔开来 对象::实例方法     例子:(x) -> System.out.println(x); 等同于 System.out::println     抽象方法参数是x,system的println方法参数也是x,所以可以这样引用 类::静态方法    (x,y) -> Math.pow(x,y) 等同于Math::pow 类::实例方法  当需要引用方法的第一个参数是调用对象,并且第二个参数是需要引用方法的第二个参数(或无参数)时: ClassName::methodName compare((x,y) -> x.equeals(y),"a","b") 等同于 compare(String::equals,"a","b") 6.构造器引用 可以把构造器引用赋值给定义的方法,与构造器参数列表要与接口中抽象方法的参数列表一致! ClassName::new 例子: (n)-.new MyClass(n);等同于 Myclass::new 7.数组引用 type[] :: new 例子:(n)-.new Integer[n];等同于Integer[]::new   Stream流   1.Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。stream自己不会存储元素,不会改变源对象,会返回一个新的stream 2.stream的操作步骤     创建 Stream 一个数据源(如:集合、数组),获取一个流 Ayyays.stream(数组) collection.stream() 返回一个顺序流  collection.parallelStream() 返回一个并行流  Stream.of(T... values)  中间操作 一个中间操作链,对数据源的数据进行处理 筛选与切片 java8 Lambda表达式java8 Lambda表达式 映射 java8 Lambda表达式java8 Lambda表达式 排序 java8 Lambda表达式java8 Lambda表达式 终止操作(终端操作)执行中间操作链,并产生结果 Stream 的终止操作 查找与匹配 java8 Lambda表达式java8 Lambda表达式java8 Lambda表达式java8 Lambda表达式 归约 java8 Lambda表达式java8 Lambda表达式 收集 java8 Lambda表达式java8 Lambda表达式java8 Lambda表达式java8 Lambda表达式java8 Lambda表达式java8 Lambda表达式   jdk8的新特性,接口中的默认方法和静态方法。 Optional 类 Optional<T> 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在, 原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且 可以避免空指针异常。 常用方法: Optional.of(T t) : 创建一个 Optional 实例 Optional.empty() : 创建一个空的 Optional 实例 Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例 isPresent() : 判断是否包含值 orElse(T t) : 如果调用对象包含值,返回该值,否则返回t orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值 map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty() flatMap(Function mapper):与 map 类似,要求返回值必须是Optional  
上一篇:Java8新特性之OPTIONAL


下一篇:# void :;