java8新特性

Posted good good study

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java8新特性相关的知识,希望对你有一定的参考价值。

java不愧是我们程序猿的天堂,他版本更新的速度快的令人发指。我们现在项目还在使用1.7版本,但是已经出到了14。虽然新版本大家都是用的不多,不过1.8版本已经被大家广泛的应用起来,还是有必要学习学习的。今天我们也来看看1.8中都有哪些新的特性。

下面先看一段代码,首先定义一个接口类。可以发现接口类不再单单的只有方法没有实现,现在他也可以有default修饰的方法实现,也可以有静态方法。这就是java8中的其中一个新特性默认方法。如果这个接口只有一个未被实现的方法,那么这个接口又可以被称为函数式接口

package eightNew;

/**
 * 这是一个函数式接口
 */
public interface Operation {

    /**有且仅有一个抽象方法,但是可以有多个非抽象方法的接口**/
    int operation(int a,int b);

    default void print(){

        System.out.println("java8新特性,接口类里面可以有default修饰的默认方法,此方法是允许实现的");
    }

    default void say(){

        System.out.println("hello world");
    }

    static void write(){

        System.out.println("静态方法不能被他的实现类调用。因为如果实现了两个类,他们都有相同的一个静态方法,这时候会有问题。");
    }

}
package eightNew;

public class MathOperation implements Operation {

    @Override
    public int operation(int a, int b) {
        return 0;
    }

    public static void main(String[] args) {
        MathOperation mathOperation = new MathOperation();
        mathOperation.print();
        mathOperation.say();

        Operation.write();
    }
}
package eightNew;

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

public class LambdaTest {
    public static void main(String[] args) {

        List<String> lists = new ArrayList<>();
        lists.add("a");
        lists.add("b");
        lists.add("c");

        //java7的写法
        Collections.sort(lists, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                return s1.compareTo(s2);
            }
        });

        //java8的写法
        Collections.sort(lists,(s1,s2) -> s1.compareTo(s2));

        /**线程的写法**/
        Thread thread = new Thread(() -> System.out.println("线程开始..."));
        thread.start();

        /**模仿上面的写法,找一下规律**/

        //不声明参数类型
        LambdaTest.operate(2,3,(a,b) -> a + b);

        //声明参数类型
        LambdaTest.operate(2,3,(int a,int b) -> a + b);

        //返回语句加上大括号
        LambdaTest.operate(2,3,(int a,int b) -> {return a + b;});

        /**方法引用**/
        //如果接口类已经有了具体的实现,那么可以通过方法引用来调用
        MathOperation mathOperation = new MathOperation();
        LambdaTest.operate(1,2,mathOperation::operation);
    }

    /**
     * 引用了接口类的方法
     * @param a
     * @param b
     * @param operation
     */
    public static void operate(int a, int b, Operation operation){
        operation.operation(a,b);
    }

    public int add(int a,int b){
        a = a + b;
        System.out.println("这是一个add()方法...");
        return a;
    }
}

上面的代码是针对java中lambda表达式方法引用的应用。方法引用比较简单,就像我们之前的类.方法差不多。

如果有一个接口类,然后有一个引用到这个接口的类,比如上面中operate()方法,他就引用到了Operation接口类。按照之前版本的写法,我们需要实现这个接口,就像MathOperation这个类一样,然后再调用operate方法时,把这个实现类传进去,就是调用实现类中实现的具体方法。lambda表达式就是简化了这个实现过程。箭头前面就是实现接口类的方法所需要的参数,后面就是方法的具体实现。但是需要注意这样的接口类里面只能有一个接口方法。不然会报错。

下面再看一下类

package eightNew;

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class StreamTest {
    public static void main(String[] args) {
        //创建一个list集合
        List<String> lists = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");

        /**求一下里面字符串长度为3的总个数**/
        int count = 0;
        Iterator<String> iterator = lists.iterator();
        while (iterator.hasNext()){
            String str = iterator.next();
            if(str.length() == 3){
                count ++ ;
            }
        }
        System.out.println("字符串长度为3的总数为:" + count);

        //使用Java8中的Stream
        long number = 0;
        number = lists.stream() //先获取集合的流
                .filter(str -> str.length()==3) //对流做相应需要的过滤处理(长度为3)
                .count(); //对处理完后的数据再做操作(比如求和)
        System.out.println("字符串长度为3的总数为:" + number);
    }
}

这个是Stream的特性,他是针对集合类使用的。

以上只是我对java8一些新特性的理解,不是很全面。先对其有些概念,在后面有机会使用再详细的深入了解。

以上是关于java8新特性的主要内容,如果未能解决你的问题,请参考以下文章

2020了你还不会Java8新特性?Java 8新特性介绍

java8新特性——Lambda表达式

Java8新特性

java8新特性总结

Java8新特性

Java8新特性-官方库新特性