java8新特性

java8新特性
一、java8有哪些新特性
lambda表达式
函数式接口
默认方法 (接口中定义default方法)
方法引用


接口中的默认方法出现的好处?
不用修改实现类的情况下, 功能的增强

Java8的明显特点是通过默认接口定义、Lambda表达式、方法引用、函数式接口带来了函数式编程

1.java8中的接口现在支持声明方法的同时提供实现,通过两种方式可以完成
(1)接口内声明静态方法
调用通过接口名.方法名
(2)接口内声明默认方法
默认方法可以被重写
调用通过接口名.super.方法名

2.函数式编程
 以函数思维做为核心,在这种思维的角度去思考问题,最重要的基础是函数的输入和输出
  使用不可变值和函数,【函数对一个值进行处理,映射成另一个值】

3.函数式接口
只定义【一个抽象方法】的接口
    只能有一个抽象方法
    可以有静态方法和默认方法,因为这两种方法都是已经实现的了
    可以包含Object里所有能重写的方法,因为即使接口包含像String toString()这样的抽象方法,它的实现类也会因继承了Object类,而再次对接口中的toString()方法进行实现。
注:哪怕有很多默认方法,只要接口只定义了一个抽象方法,它就仍然是一个函数式接口。

(1)函数式接口的作用
方便直接用Lambda表达式构造出实例,让代码更加简洁
Lambda表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例。
你用匿名内部类也可以完成同样的事情,只不过比较笨拙。
Comparator<String> c = new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return o2.length()-o1.length();
        }
    };
//函数式编程 : 参数+返回值
    Comparator<String> d = (o1,o2)->o2.length()-o1.length();
(2) 函数描述符
    函数式接口中的抽象方法的名基本上就是Lambda表达式的名,我们将这种抽象方法叫作函数描述符。
    () -> {}
    参数列表可以写类型 可以不写类型


(3)声明函数式接口 @FunctionalInterface
    这个标注用于表示该接口会设计成一个函数式接口

4.lambda表达式
它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。
   (参数列表)->{return 返回值}
   
lambda中变量的问题:
lambda中可以使用成员变量,局部变量,但是使用过局部变量以后,该局部变量就必须为final,所以不能再修改了。

(1)不需要声明参数类型,编译器可以统一识别参数值。
(2)一个参数无需定义圆括号,但多个参数需要定义圆括号。
(3)lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改
(4)在lambda表达式不允许声明与全局变量相同的局部变量、参数。

5.四大函数式接口

消费型接口 Consumer<T> void accept(T t);
供给型接口 Supplier<T> T get();
函数型接口 Function<T> R apply(T t);
断定型接口 Predicate<T> boolean test(T t);


 Predicate<T>:断言型接口
//接收一个对象,返回boolean型结果。
//将满足条件的字符串 ,放入集合中去
boolean test(T t);
 public class LambdaTest4 {
            public static void filter(List<String> languages, Predicate<String> condition) {  
                for(String name: languages) {  
                   if(condition.test(name)) {  
                      System.out.println(name + " ");  
                   }  
                }  
            }  
            public static void main(String[] args) {
               List<String> languages = Arrays.asList("Java", "html5","JavaScript", "C++", "hibernate", "PHP");
               
               //开头是J的语言
               filter(languages,(String name)->name.startsWith("J"));
               //5结尾的
               filter(languages,(String name)->name.endsWith("5"));
               
               //所有的语言
               filter(languages,(name)->true);
               //一个都不显示
               filter(languages,(name)->false);
               //显示名字长度大于4
               filter(languages,(name)->name.length()>4);
               System.out.println("-----------------------");
               //名字以J开头并且长度大于4的
               Predicate<String> c1 = (name)->name.startsWith("J");
               Predicate<String> c2 = (name)->name.length()>4;
               filter(languages,c1.and(c2));
}
 
Function<T,R>:函数型接口
R apply(T t);     有参数有返回值
//表示接收一个参数并产生结果的函数


Consumer<T>:消费型接口
void accept(T t);有参数没有返回值

Supplier<T>:供给型接口
T get();没参数有返回值


4.java常用的函数式编程接口
1.比较器
2.实现线程
3.绑定事件
4.集合数据排序

比较苹果的重量
// 3、使用Lambda表达式
inventory.sort((a, b) -> a.getWeight() - b.getWeight());

// 4、使用Comparator的comparing
Comparator<Apple> comparing =Comparator.comparing((Apple a) -> a.getWeight());

inventory.sort(Comparator.comparing((Apple a) -> a.getWeight()));

//或者等价于
inventory.sort(
Comparator.comparing(Apple::getWeight));

 

public class Test {
    public static void main(String[] args) {
        ArrayList<Apple> list = new ArrayList<>();
        list.add(new Apple(26,"gala"));
        list.add(new Apple(52,"luo"));
        list.add(new Apple(22,"s"));
        list.add(new Apple(33,"cheng"));
        Comparator<Apple> comparing = Comparator.comparing((Apple apple) -> apple.getName().length());
        list.sort(comparing);
        System.out.println(list);
    }

  



 

posted @ 2019-12-10 09:29  下饭  阅读(155)  评论(0编辑  收藏  举报