JDK1.8新特性

1.default关键字

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

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

作用是什么?

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

2.lambda表达式

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

函数式编程:

  • 是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量。
  • 也就是说,输入确定,输出也就是确定的。

特点

  • 允许把函数本身作为参数传入另一个函数,还允许返回一个函数

格式

  • ->符号
  • 左侧 参数列表
  • 右侧 所需的功能,即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.局部变量限制

  • Lambda可以没有限制的捕获实例变量和静态变量。
  • 但是局部变量必须声明为final
    • 使用lambda的线程,可能会在分配该变量的线程将这个变量回收之后,去访问的。
    • 因此,在访问局部变量时,实际上是访问他的副本,而不是原始变量。
    • 如果被final修饰之后,那就没什么区别了(原始和副本)
final int num = 1;
Converter<Integer, String> stringConverter =
        (from) -> String.valueOf(from + num);
stringConverter.convert(2);

6.Date api更新

7.Stream

定义:

  • 不是集合元素,不是数据结构,不保存数据
  • 更新一个高级版的Iterator,用户只需要给出对其包含的元素执行什么操作,stream会在内部进行遍历,做出相应的数据转换。
  • 可以并行化操作,遍历时,数据会被分成多个段,每一个段都在不同的线程中处理,然后将结果一起输出。

类型有两种:

  • Intermediate
    • 打开流,做出某种数据映射或过滤,然后返回一个新的流。
    • 一个流后可以跟0个或者多个这种流
  • Terminal
    • 会真正的开始流的遍历,并生成一个结果 或副作用(side effect)
    • 所以一个流只能有一个terminal操作,执行完,流就被用光了。
int sum = widgets.stream()
.filter(w -> w.getColor() == RED)
 .mapToInt(w -> w.getWeight())
 .sum();

  • stream() 获取当前widgets的source
  • filter mapTotInt 为Intermediate操作,进行数据筛选和转换
  • sum为terminal操作,得到一个求和的结果

所以流的使用就是实现一个 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();

流的操作 参考

  • Intermediate
    • map (mapToInt, flatMap 等)(映射)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered
  • Terminal
    • forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator
  • Short-circuiting
    • anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 limit

8. Annotation注解

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

9.Optional

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

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

还有一些其他的方法。

10.新的工具和引擎

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,914评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,935评论 2 383
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,531评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,309评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,381评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,730评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,882评论 3 404
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,643评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,095评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,448评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,566评论 1 339
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,253评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,829评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,715评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,945评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,248评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,440评论 2 348

推荐阅读更多精彩内容