JDK1.8新特性

2018-08-21  本文已影响0人  小绵羊你毛不多

1.default关键字

java里,接口是不能有方法的实现的。1.8通过default关键字可以实现

public interface NewChar {
    
    public void test1();
    
    public default void test2(){
        System.out.println("我是新特性1");
    }
}

作用是什么?

定义一个默认方法,这个接口的实现类实现了这个接口之后,不用管这个方法的实现,可以直接调用。

2.lambda表达式

意味着开始使用函数式编程

函数式编程:

特点

格式

先来看一个例子

//常规的 集合排序 需要对接口方法重写
 public void test1(){
        List<String> list =Arrays.asList("aaa","fsa","ser","eere");
         //对接口方法重写
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o2.compareTo(o1);
            }
        });
        for (String string : list) {
            System.out.println(string);
        }
    }
    
//不带参数类型的lambda写法

      public void testLamda2(){
        List<String> list =Arrays.asList("aaa","fsa","ser","eere");
    // ->符号
        Collections.sort(list, (a,b)->b.compareTo(a)
        );
        for (String string : list) {
            System.out.println(string);
        }

3.函数式接口

仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会匹配到这个抽象方法

// 这个注解定义函数式接口
@FunctionalInterface
public interface MyLamda {
    //只允许定义一个抽象方法
    public void test1(String y);

//这里如果继续加一个抽象方法便会报错
//    public void test1();
    
//default方法可以任意定义
    default String test2(){
        return "123";
    }
    
    default String test3(){
        return "123";
    }

//static方法也可以定义
    static void test4(){
        System.out.println("234");
    }

}

看一下调用抽象方法

MyLamda m = y -> System.out.println("ss"+y);

4.方法和构造函数引用

符号 :: ClassName::MethodName 没有()

先定义一个函数式接口

@FunctionalInterface
public interface TestConverT<T, F> {
    F convert(T t);
}

测试
public void test(){
//调用Integer的valueOf方法
    TestConverT<String, Integer> t = Integer::valueOf;
    Integer i = t.convert("111");
    System.out.println(i);
}

对于构造方法也可以这样调用

//实体类User和它的构造方法
public class User {    
    private String name;
    
    private String sex;

    public User(String name, String sex) {
        super();
        this.name = name;
        this.sex = sex;
    }
}
//User工厂
public interface UserFactory {
    User get(String name, String sex);
}
//测试类   这里编译器会根据uf调用的参数来选择合适的构造函数
    UserFactory uf = User::new;
    User u = uf.get("ww", "man");

5.局部变量限制

final int num = 1;
Converter<Integer, String> stringConverter =
        (from) -> String.valueOf(from + num);
stringConverter.convert(2);

6.Date api更新

7.Stream

定义:

类型有两种:

int sum = widgets.stream()
.filter(w -> w.getColor() == RED)
 .mapToInt(w -> w.getWeight())
 .sum();

所以流的使用就是实现一个 filter-map-reduce过程,产生一个结果或者导致一个副作用(side effect)

构造流的方式

// 1. Individual values
Stream stream = Stream.of("a", "b", "c");
// 2. Arrays
String [] strArray = new String[] {"a", "b", "c"};
stream = Stream.of(strArray);
stream = Arrays.stream(strArray);
// 3. Collections
List<String> list = Arrays.asList(strArray);
stream = list.stream();

流的操作 参考

8. Annotation注解

Java 8允许我们把同一个类型的注解使用多次,只需要给该注解标注一下@Repeatable即可。

9.Optional

解决空指针的问题
提供了一些方法,来做判断

//不管param是不是null 都不会抛出异常
Optional<String> nullOptional = Optional.ofNullable(param);

还有一些其他的方法。

10.新的工具和引擎

上一篇 下一篇

猜你喜欢

热点阅读