java8新特性整理

java8主要有9个方面的新特性

  1.方法引用supplier<T>

  2.函数式接口function和Predicate,consumer,supplier

  3.lambda表达式

  4.默认方法

  5.Stream

  6.Optional类

  7.新的日期api

  8.Base64

  9.Nashorn JavaScript引擎

 

一.方法引用Supplier<T>

类型语法对应的Lambda表达式
静态方法引用类名::staticMethod(args) -> 类名.staticMethod(args)
实例方法引用inst::instMethod(args) -> inst.instMethod(args)
对象方法引用类名::instMethod(inst,args) -> 类名.instMethod(args)
构建方法引用类名::new(args) -> new 类名(args)
import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier;

public class StudentDO {

    private String name;
    private String sex;
    private Integer age;

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

    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }

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

    //构造方法
    public static StudentDO create(Supplier<StudentDO> studentDOSupplier){
        return studentDOSupplier.get();
    }

    //静态方法
    public static void getStuName(StudentDO student){
        System.out.println("name:"+student.getName());
    }

    //自定义方法
    public void getSex(StudentDO student){
        System.out.println("age:"+student.getAge());
    }
}

class testSupplier{
    public static void main(String[] args) {
        //引用构造器
        StudentDO studentDO = StudentDO.create(StudentDO::new);

        //引用静态防范
        studentDO.setName("路飞");
        studentDO.setAge(20);
        List<StudentDO> list = Arrays.asList(studentDO);
        list.forEach(StudentDO::getStuName);

        //自定义对象引用
        list.forEach(StudentDO::getSex);
        //引用示例
        list.forEach(System.out::print);
    }
}

二.函数式接口

 函数式接口是指:有且只有一个抽象方法的接口。java中的函数式编程体现就是Lambda,所以函数式接口就是可以适用于Lambda使用的接口。

 只有确保接口中有且仅有一个抽象方法,Java中的Lambda才能顺利地进行推导。

@FunctionalInterface注解  标明此接口为函数式接口
@FunctionalInterface
interface  functionalInterface {
  
    void method();
}

方法实现

public class functionalInterfaceTest {

    public static void doSomthing(functionalInterface functionalInterface){
        functionalInterface.method();
    }

    public static void main(String[] args) {
        //调用函数式接口的方法
        doSomthing(()->System.out.println("excuter lambda!"));
    }
}

lambda的延迟执行,labmda表达式是延迟执行的

@FunctionalInterface
public interface functionalInterfaceTest2 {
    String method();
}

class functionalInterfaceTest2Impl{
   private static void info(int flag,functionalInterfaceTest2 interfaceTest2){
       if (flag == 1){
           System.out.println(interfaceTest2.method());
       }
   }

    public static void main(String[] args) {
        info(1,()->{
            System.out.println("是否执行");
            return "yes";
        });
    }
}

使用Lambda作为参数和返回值

private static Comparator<String> lambdaInfo(){
       return new Comparator<String>(){

           @Override
           public int compare(String o1, String o2) {
               return o1.length() - o2.length();
           }
       };
   }


  public static void main(String[] args) {
 
        String[] array = {"java","php","c"};
        Arrays.sort(array,lambdaInfo());
        System.out.println(Arrays.toString(array));
    }

2.1 Supplier接口

  private static String supplier(Supplier<String> msg){
       return msg.get();
   }


 System.out.println(supplier(()->"生产数据"));

//求数组最大长度
 String result = supplier(()->{
           int len = 0;
           for (int i=0;i<array.length;i++){
               len = Math.max(len,array[i].length());
           }
           return String.valueOf(len);
        });
        System.out.println("result:"+result);

2.2 Consumer接口

Consumer 接口中包含抽象方法 void accept(T t) ,意为消费一个指定泛型的数据 默认方法:andThen

private static void consumerTest(Consumer<String> consumer){
       consumer.accept("已消费");
 }

private static void consumerTest(Consumer<String> consumer,Consumer<String> consumer2){
        consumer.andThen(consumer2).accept("已消费");
 }

 consumerTest(s-> System.out.println(s));
        consumerTest(s-> {
            System.out.println(s);
        },s2->{
            System.out.println(s2);
        });

2.3 Predicate接口

Predicate 接口中包含一个抽象方法: boolean test(T t) 。用于条件判断的场景

    //判断是否存在
    private static void predicateTest(Predicate<String> predicate){
        predicate.test("java");
    }

    //判断是否同时存在
    private static void predicateTest(Predicate<String> predicate,Predicate<String> predicate2){
        predicate.and(predicate2).test("java");
    }
    //判断是否存在其中一方
    private static void predicateTestOr(Predicate<String> predicate,Predicate<String> predicate2){
        predicate.or(predicate2).test("java");
    }

    //判断是不存在
    private static void predicateTestNo(Predicate<String> predicate){
        predicate.negate().test("java");
    }

    private static void getpredictAndArr(Predicate<String> one,
                                         Predicate<String> two, String[] arr) {
        for (String string : arr) {
            if (one.and(two).test(string)) {
                System.out.println(string);
            }
        }
    }
    predicateTest((s)->s.contains("j"));
    predicateTest(s->s.contains("j"), s->s.contains("a"));
    predicateTestOr(s->s.contains("a"), s->s.contains("h"));
    predicateTestNo(s->s.contains("a"));
    getpredictAndArr((x)->x.concat(x).equals("j"),(y)->y.concat(y).equals("a"),array);

2.4 Function接口

接口用来根据一个类型的数据得到另一个类型的数据,前者称为前置条件,后者称为后置条件

Function 接口中有一个默认的 andThen  compose方法

private static void numberToString(Function<Integer, String> function) {
        String apply = function.apply(12);
        System.out.println("转换结果:"+apply);
}

numberToString((s)->String.valueOf(s));

三.lambda表达式

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无情丨命运

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值