java8新特性总结

java8新特性

Lambda表达式

  • Lambda允许将一个函数作为方法的参数
  • Lambda让代码变得更简洁紧凑

例:

	public class Java8Tester {
	   public static void main(String args[]){
	      Java8Tester tester = new Java8Tester();
	        
	      // 类型声明
	      MathOperation addition = (int a, int b) -> a + b;
	        
	      // 不用类型声明
	      MathOperation subtraction = (a, b) -> a - b;
	        
	      // 大括号中的返回语句
	      MathOperation multiplication = (int a, int b) -> { return a * b; };
	        
	      // 没有大括号及返回语句
	      MathOperation division = (int a, int b) -> a / b;
	        
	      System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
	      System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
	      System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
	      System.out.println("10 / 5 = " + tester.operate(10, 5, division));
	        
	      // 不用括号
	      GreetingService greetService1 = message ->
	      System.out.println("Hello " + message);
	        
	      // 用括号
	      GreetingService greetService2 = (message) ->
	      System.out.println("Hello " + message);
	        
	      greetService1.sayMessage("Runoob");
	      greetService2.sayMessage("Google");
	   }
	    
	   interface MathOperation {
	      int operation(int a, int b);
	   }
	    
	   interface GreetingService {
	      void sayMessage(String message);
	   }
	    
	   private int operate(int a, int b, MathOperation mathOperation){
	      return mathOperation.operation(a, b);
	   }
	}
Lambda表达式的重要特征:
  • 可选类型说明:不需要声明参数类型,编译器可以统一识别参数值。
  • 可选的参数圆括号:一个参数无需定义参数圆括号,多个参数时必须定义圆括号。
  • 可选的大括号:方法体只有一条语句,大括号可以省略。
  • 可选的返回值:如果方法体中只有一个表达式,则编译器会自动将这个表达式作为返回值,否则,大括号里要指定表达式为返回值。
使用 Lambda 表达式需要注意以下两点:
  • Lambda 表达式主要用来定义行内执行的方法类型接口,例如,一个简单方法接口。在上面例子中,我们使用各种类型的Lambda表达式来定义MathOperation接口的方法。然后我们定义了sayMessage的执行。
  • Lambda 表达式免去了使用匿名方法的麻烦,并且给予Java简单但是强大的函数化的编程能力。

方法引用

  • 方法引用通过方法的名字来指向一个方法。

  • 方法引用可以使语言的构造更紧凑简洁,减少冗余代码。

  • 方法引用使用一对冒号 :: 。

      public class Java8Tester {
         public static void main(String args[]){
            List<String> names = new ArrayList();
    
            names.add("Google");
            names.add("Runoob");
            names.add("Taobao");
            names.add("Baidu");
            names.add("Sina");
              
            names.forEach(System.out::println);
         }
      }
    

函数式接口

  • 函数式接口有且仅有一个抽象方法,可以有0个或多个非抽象方法。
  • 可以作为方法参数,与Lambda表达式结合使用。

接口的默认方法

	public interface Vehicle {
	   default void print(){
	      System.out.println("我是一辆车!");
	   }
	}

:一个类实现了多个接口,每个接口都有它的默认方法,有两种解决方法:

  1. 子类创建自己的默认方法
  2. 使用super来指定调用哪个接口的默认方法

Stream

Stream(流)是一个来自数据源的元素队列并支持聚合操作
  • 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
  • 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
  • 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。
和以前的Collection操作不同, Stream操作还有两个基础的特征:
  • Pipelining: 中间操作都会返回流对象本身。这样多个操作可以串联成一个管道,如同流式风格(fluent style)。这样做可以对操作进行优化,比如延迟执行(laziness)和短路(short-circuiting)。
  • 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。

Optional 类

  • Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。

  • Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。

  • Optional 类的引入很好的解决空指针异常。

      public class Java8Tester {
         public static void main(String args[]){
         
            Java8Tester java8Tester = new Java8Tester();
            Integer value1 = null;
            Integer value2 = new Integer(10);
              
            // Optional.ofNullable - 允许传递为 null 参数
            Optional<Integer> a = Optional.ofNullable(value1);
              
            // Optional.of - 如果传递的参数是 null,抛出异常 NullPointerException
            Optional<Integer> b = Optional.of(value2);
            System.out.println(java8Tester.sum(a,b));
         }
          
         public Integer sum(Optional<Integer> a, Optional<Integer> b){
          
            // Optional.isPresent - 判断值是否存在
              
            System.out.println("第一个参数值存在: " + a.isPresent());
            System.out.println("第二个参数值存在: " + b.isPresent());
              
            // Optional.orElse - 如果值存在,返回它,否则返回默认值
            Integer value1 = a.orElse(new Integer(0));
              
            //Optional.get - 获取值,值需要存在
            Integer value2 = b.get();
            return value1 + value2;
         }
      }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值