zoukankan      html  css  js  c++  java
  • 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一些新特性的理解,不是很全面。先对其有些概念,在后面有机会使用再详细的深入了解。

  • 相关阅读:
    负载均衡算法(四)IP Hash负载均衡算法
    负载均衡算法(二)加权轮询负载均衡算法
    负载均衡算法(一)轮询负载均衡算法
    移动端媒体查询CSS3适配规则
    JavaScript中label语句的使用
    NODE简易综合应用服务器搭建
    ES6--不定参数
    ES6--默认参数表达式,参数变动
    node基础学习——http基础知识-02-http响应数据流
    node基础学习——http基础知识-01-客户单请求
  • 原文地址:https://www.cnblogs.com/wanghq1994/p/12195975.html
Copyright © 2011-2022 走看看