java 8 新特性 笔记

16 篇文章 0 订阅

一.Lambda的定义

Lambda表达式有参数、箭头和主体组成。
左侧:指定了Lambda表达式需要的所有参数 ;右侧:指定了Lambda体,即lambda表达式要执行的功能
 Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
 Lambda有参数列表、函数主体、返回类型,还可能有可以抛出的异常列表。
lambda表达式本质上是一个匿名类。lambda表达式也常被称为闭包。
格式如下:
(parameters) -> expression或(parameters) ->{statements; }
// 1. 不需要参数,返回值为 5  
() -> 5  
// 2. 接收一个参数(数字类型),返回其2倍的值  
x -> 2 * x  
// 3. 接受2个参数(数字),并返回他们的差值  
(x, y) -> x – y  
// 4. 接收2个int型整数,返回他们的和  
(int x, int y) -> x + y  
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  
(String s) -> System.out.print(s)  

例子:

package com.ljf.java8.demo.lamda;

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * @className SortTest
 * @Description TODO
 * @Author admin
 * @Date 2019/5/16 18:34
 * @Version 1.0
 **/


public class SortTest {
    public static void main(String args[]){
    System.out.println("");
        List<String> List = Arrays.asList("peter", "anna", "mike", "xenia");
         //匿名类的方式
        Collections.sort(List, new Comparator<String>() {
            @Override
            public int compare(String a, String b) {
                return b.compareTo(a);
            }
        });
        System.out.println(""+List.toString());
        //lambda表达式的写法
        Collections.sort(List, (String a, String b) -> {
            return b.compareTo(a);
        });
        System.out.println(""+List.toString());
        //lambda表达式的简写
        Collections.sort(List, (String a, String b) -> b.compareTo(a));
        System.out.println(""+List.toString());
    }
    //https://blog.csdn.net/zhwyj1019/article/details/80585245
    //https://blog.csdn.net/Alex_cun/article/details/80191327
   // https://blog.csdn.net/zhwyj1019/article/details/80585245
   // http://blog.didispace.com/books/java8-tutorial/ch1.html
}

结果为:
[xenia, peter, mike, anna]
[xenia, peter, mike, anna]
[xenia, peter, mike, anna]

二.函数式接口的定义

一个所谓的函数式接口必须要有且仅有一个抽象方法的声明。(接口中的方法都为public abstract
每一个lambda都能够通过一个特定的接口,与一个给定的类型进行匹配。使用lambda表达式,一般需要先定义函数接口

例子:

public interface QiuHe {
    public abstract int  calculate(int x,int y);
}


public class QiuHeImpl implements QiuHe{
    @Override
    public int calculate(int x, int y) {
        return x+y;
    }
}

public class TestQiuhe {
    public static void main(String args[]){
        //1.一般方式:通过子类对象调用
        QiuHe qiuHeImpl=new QiuHeImpl();
       int m= qiuHeImpl.calculate(3,4);
       System.out.println("子类对象调用:"+m);
       //2.通过匿名类的调用
        QiuHe qiuHe2=new QiuHe() {
            @Override
            public int calculate(int x, int y) {
                return x+y;
            }
        };
      int t=  qiuHe2.calculate(3,4);
        System.out.println("匿名类的调用:"+t);
       // 3.  通过函数接口(含lambda表达式)
       QiuHe qiuHe=(int a,int b)-> { return a+b;};
      int s=qiuHe.calculate(3,4);
      System.out.println("通过函数接口:"+s);

    }
}

三.lambda调用方法

Java 8 允许你通过::关键字获取方法或者构造函数的的引用

其实,方法引用就是Lambda表达式,就是函数式接口的一个实例,可以认为是Lambda表达式的一个语法糖。但是,并不是所有的Lambda表达式都可以使用方法引用来表示,需要满足一定的条件(抽象接口的实现需满足一定的条件),才能使用方法引用表示。

我们可以把方法引用理解为方法的指针,指向的是另外一个方法。也就是说,如果抽象方法的实现恰好可以使用调用另外一个方法来实现,就有可能可以使用方法引用。注意是有可能。下面就对方法引用来进行介绍。

方法引用总共分为4类:

1. 类名::静态方法名
2. 对象名::实例方法名
3. 类名::实例方法名
4. 构造方法引用: 类名::new

例子:

package com.ljf.java8.demo.FunctionInterfaceDm;

/**
 * @className Student
 * @Description TODO
 * @Author admin
 * @Date 2019/5/17 15:05
 * @Version 1.0
 **/


public class Student {
    private String address;

    private String name="123";

    private Integer age;
    public int compareByName(Student student) {
        return this.getName()
                .compareToIgnoreCase(student.getName());
    }
  public  void show(){
    System.out.println("我是一个非静态方法");
}
    /**
     *
     */
   public static void say(Student stu){
       System.out.println("我是一个静态方法:"+stu.name);

   }
    public Student() {
    }

    public Student(String address) {
        this.address = address;
    }

    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public Student(String address, String name, Integer age) {
        this.address = address;
        this.name = name;
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}



package com.ljf.java8.demo.FunctionInterfaceDm;

import java.util.function.*;

/**
 * @className TestStudent
 * @Description TODO
 * @Author admin
 * @Date 2019/5/17 15:08
 * @Version 1.0
 **/


public class TestStudent {
    public static void main(String args[]){
    System.out.println("");
        Student emp = new Student("上海", "xiaoMIng", 18);
        //第一种  一般表达式
        Supplier<String> supper1 = () -> emp.getAddress();
        System.out.println(supper1.get());//上海
        //第二种 对象实例::实例方法名
        Supplier<String> supper = emp::getAddress;
        System.out.println(supper.get()); //上海
        //第三种   类:: 静态方法
        Consumer<Student> consumer2 =Student::say;//我是一个静态方法xiaoMIng
        consumer2.accept(emp); //
        //第四种   类:: 实例方法名
        Consumer<Student> consumer1  = Student::show;//我是一个非静态方法
         consumer1.accept(emp);
        /*************** 构造器的引用 ****************/
        // 无参构造函数,创建实例
        Supplier<Student> supper2 = () -> new Student();
        Supplier<Student> supper3 = Student::new;
        Student emp1 = supper3.get();
        emp1.setAddress("北京");
        Supplier<String> supp = emp1::getAddress;
        System.out.println(supp.get());   //北京
        // 一个参数
        Function<String, Student> fun = address -> new Student(address);
        Function<String, Student> fun1 = Student::new;
        System.out.println(fun1.apply("beijing").getAddress());//beijing

        // 两个参数
        BiFunction<String, Integer, Student> bFun = (name, age) -> new Student(name, age);
        BiFunction<String, Integer, Student> bFun1 = Student::new;
        System.out.println(bFun1.apply("xiaohong", 18).getName());//xiaohong

       // https://blog.csdn.net/qq_28410283/article/details/80963351
    }
}

 //https://my.oschina.net/aronykl/blog/1507084

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值