java se 8 学习(1、lambda初识)

还java8感受很新嘛? java

看看jdk.java.net中已经jdk12啦,那还不赶快学,再不学真来不及了 相信你们的项目里面有不少已经用了jdk8了,可是又有多少真正使用的java8的新特性呢? 本人一边学习一边总结,但愿也能够对正在学习java8的javaer有所帮助吧

为何使用lambda表达式?

咱们先看一下一些代码原来的写法吧,相信你们会异常熟悉的git

  • 实现Runnable接口来实现多线程的写法
public class Worker implements Runnable {

    @Override
    public void run() {
        System.out.println("实现runnable接口,实现多线程");
    }
}

//实现多线程
Worker worker = new Worker();
new Thread(worker).start();
复制代码
  • 实现Comparator接口来实现自定义比较器
public class LengthComparator implements Comparator<String> {

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

String[] strings = new String[]{"tony", "a", "tom", "jack"};
Arrays.sort(strings, new LengthComparator());
复制代码

上面量个例子都是将一个实现接口的类的对象传递给一个方法调用,由于在java8以前java是不支持将代码块作为参数传递的github

lambda表达式使用

仍是使用上面的两个实例多线程

  • 实现多线程
//java8
new Thread(() -> {
    System.out.println("lambda实现多线程"); 
}).start();
//只有一行简化{}
new Thread(() -> System.out.println("lambda实现多线程")).start();
复制代码
  • 实现比较器
//java8
Arrays.sort(strings, (first, second) -> {
    return Integer.compare(first.length(), second.length());
});
//代码中只有return语句,可简化
Arrays.sort(strings, (first, second) -> Integer.compare(first.length(), second.length()));
//参数调用其类的相同方法,再简化
Arrays.sort(strings, Comparator.comparingInt(String::length));
复制代码

和原来的写法比较,java8的写法是否是又简单又炫酷。下面简单的说一说语法吧,当时我也理解一会呢。若是你的JavaScript(ES6)写的很6,那么理解起来真的是如数家珍。ide

  • 从上面的两个例子能够看出,lambda表达式都是用于直接实现接口的,不须要类去实现了,咱们本身写一个接口试试
public interface IOneMethods {

    void method();
}

void testOneMethod(IOneMethods iOneMethods){
    iOneMethods.method();
    System.out.println("为了使用lambda表达式");
}

//一个抽象方法的接口用lambda
new Test().testOneMethod(() -> System.out.println("使用lambda表达式实现接口"));
复制代码

这边咱们看到接口里面只有一个抽象方法,若是有两个或者是多个可不可使用lambda表达式呢,咱们新建一个试一下就知道了函数

public interface ITwoMethods {

    void firstMethod();

    void secondMethod(String methodName);
}

void testTwoMethod(ITwoMethods iTwoMethods){
    System.out.println("为了使用lambda表达式");
}

//两个抽象方法的接口使用lambda
new Test().testTwoMethod(() -> System.out.println("使用lambda表达式实现接口"));
new Test().testTwoMethod((name) -> System.out.println(name));
复制代码
  • 代码很好看对吧,看下个人截图,我还为了区别两个抽象方向,让参数不同,结果仍是不行的,因此本身写的接口只有一个抽象方法的时候才可使用lambda表达式

因此这边就引入一个新的概念——函数式接口

对于只包含一个抽象方法的接口,你可使用lambda表达式来建立该接口的对象。这种接口被称为函数式接口。当你但愿使用lambda表达式的时候,你必需要记住表达式的目的,并为他指定一个函数式接口。学习

  • 咱们能够为函数式接口添加@FunctionalInterface注解,编译的时候和生成接口文档的时候就会检查和声明这是一个函数式接口
@FunctionalInterface
public interface IOneMethods {

    void method();
}
复制代码

方法的引用

上面咱们看到这样一个符号 :: 实际上面这对对象方法的引用spa

//方法引用::
    List<String> stringList = Arrays.asList(strings);
// List<Integer> stringLength = stringList.stream().map(string -> string.length()).collect(Collectors.toList());
    List<Integer> stringLength = stringList.stream().map(String::length).collect(Collectors.toList());
复制代码
  • 这边里面有一些steam的东西后面我会讲的,咱们就看map里面的 string -> string.length() length()方法是String类中的,因此咱们在lambda中能够用 类名::方法 去实现,包括一个new对象的操做 Preson::new

以上属于自学总结,若有有说的有问题的方法欢迎指出

代码存于github上面也欢迎star.net

  • https://github.com/Radicalpro/LearningJDK8
相关文章
相关标签/搜索