java8新特性实践

本文详细介绍了Java 8的多项新特性,包括Lambda表达式、函数式接口、方法引用、重复注解、更好的类型推断、Optional、Stream API、Date/Time API以及JavaScript引擎Nashorn等。通过实例解析,帮助开发者更好地理解和应用这些新特性。
摘要由CSDN通过智能技术生成

Lambda表达式

  • Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中),或者把代码看成数据

  • 最简单的形式中,一个lambda可以由用逗号分隔的参数列表、–>符号与函数体三部分表示:

    Arrays.asList( 1, 2, 3 ).forEach( e -> System.out.println( e ) );
    
  • Lambda可以引用类的成员变量与局部变量(如果这些变量不是final的话,它们会被隐含的转为final,这样效率更高):

    String str = ",";           //等价于:final String str = ",";
    Arrays.asList( "a", "b", "c" ).forEach( 
        ( String e ) -> System.out.print( e + str ) );  
    
  • Lambda可能会返回一个值。返回值的类型也是由编译器推测出来的。如果lambda的函数体只有一行的话,那么没有必要显式使用return语句:

    List<Integer> list = Arrays.asList( 4, 2, 1,3);
    list.sort( ( e1, e2 ) -> e1.compareTo( e2 ) );
    list.forEach(e->System.out.println(e)); 
    

函数式接口

  • 如何使现有的函数友好地支持lambda,java8采取了增加函数式接口的概念。
  • 函数式接口就是一个只有一个方法的普通接口,可以隐式的转换成lambda表达式,除了特殊方法:默认方法,静态方法以及继承自Object类的一些方法(toString(),equels()等)
  • 在使用中,函数式接口容易出错,如果接口中被定义了另一个方法,那么接口将不再是函数式接口,导致编译失败。为此Java8新增注解@FunctionalInterface。注意default默认方法和静态方法不会影响函数式接口。

    @FunctionalInterface
    public interface Runnable {
        public abstract void run();
    }
    
  • java8新增默认方法和静态方法扩展接口的声明。

    public interface Convert {
    
        //可以包含静态方法
        public static void hasStaticMethod(){
            System.out.println("包含静态方法");
        }
    
        default void hasDefaultMethod(){
            System.out.println("包含默认方法");
        }
    }
    
  • 函数式接口示例

    @FunctionalInterface
    public interface Convert<F,T> {
    
        T convert(F from);
    
        //可以包含静态方法
        public static void hasStaticMethod(){
            System.out.println("包含静态方法");
        }
    
        default void hasDefaultMethod(){
            System.out.println("包含默认方法");
        }
    }
    
    public class ConvertMain {
    public static void main(String[] args) {
    
        Convert<String, Integer> converter = (from) -> Integer.valueOf(from);
        Integer converted = converter.convert("123");
        System.out.println(converted);
        converter.hasDefaultMethod();
        Convert.hasStaticMethod();
    
    
        // Function<T, R> -T作为输入,返回的R作为输出
        Function<String,String> function = (x) -> {System.out.print(x+": ");return "Function";};
        System.out.println(function.apply("hello world"));
    
        //Predicate<T> -T作为输入,返回的boolean值作为输出
        Predicate<String> pre = (x) ->{System.out.print(x);return false;};
        System.out.println(": "+pre.test("hello World"));
    
        //Consumer<T> - T作为输入,执行某种动作但没有返回值
        Consumer<String> con = (x) -> {System.out.println(x);};
        con.accept("hello world");
    
        //Supplier<T> - 没有任何输入,返回T
        Supplier<String> supp = () -> {return "Supplier";};
        System.out.println(supp.get());
    
    
        //BinaryOperator<T> -两个T作为输入,返回一个T作为输出,对于“reduce”操作很有用
        BinaryOperator<String> bina = (x,y) ->{System.out.print(x+" "+y);return "BinaryOperator";};
        System.out.println("  "+bina.apply("hello ","world"));
    
    }
    

    }

方法引用(::

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值