java8新特性

JAVA8新特性

速度更快

Lambda表达式

Stream API

便于并行

最大化的减少空指针异常

速度更快

HashMap

Lambda表达式

简介

Lambda表达式,也可称为闭包,它允许把函数作为一个方法的参数,使用Lambda表达式可以使代码变的更加简洁紧凑。

语法格式

(parameters) ->{ statements; }

重要特征:

不需要声明参数类型,编译器可以自动类型推断

如果只有一个参数,()可以省略

如果主体部分只有一个语句,可以省略{}

如果主体只有一个表达式,可以省略return关键字

注意事项:

要用lambda形式使用接口,需要接口为函数式接口

lambda表达式只能引用标记了final的外层局部变量

这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。

函数式接口:

简介:

所谓函数接口,是只有一个抽象方法的接口,但是允许其他使用default方法修饰的接口存在.

java8中提供了一个注解@FunctionalInterface,用来校验一个接口是不是函数式接口.

JAVA8的四大核心内置函数式接口:

1)  Consumer:消费型接口,适用于有一个入参,没有返回值的场景.lambda表达式代表的是[[消费过程]]

public interface Consumer<T> {

void accept(T t);

}

2)  Supplier:生产型接口,适用于没有入参,有一个返回值的场景.lambda表达式代表的是[[生产过程]]

public interface Supplier<T> {

T get();

}

3) Function:加工型接口,适用于一个类型的入参,一个类型的返回值场景.lambda表达式代表的是[[加工过程]]

public interface Function<T, R> {

R apply(T t);

}

4) Predicate:断言型接口,适用于用于条件判断的场景,lambda表达式代表的是[[条件]]

public interface Predicate<T>{

  boolean test(T t);

}

构造器引用和方法引用

构造器和方法引用可以认为是Lambda的另一种表现形式:

1)构造器引用,它的语法是Class::new

Supplier<Student> s = () -> new Student()

Supplier<Student> s = Student::new;

s.get();

2)类的静态方法引用,它的语法是Class::static_method

Comparator<Integer> c = (x,y) -> Integer.compare(x,y);

Comparator<Integer> c =  Integer::compare;

3)对象的实例方法引用,它的语法是instance::method

Consumer<String> c = (x) -> System.out.println(x);

Consumer<String> c = System.out::println;

c.accept("Yes");

4)类的实例方法引用,它的语法是Class::method

BiPredicate<String, String> bp = (x,y) -> x.equals(y);

BiPredicate<String, String> bp = String::equals;

bp.test("A", "B");

Stream API

Stream API极大简化了集合框架的处理,当使用Stream时,会有三个阶段:

1)创建一个Stream。

2)在一个或多个步骤中,将初始Stream转化到另一个Stream的中间操作。

3)使用一个终止操作来产生一个结果。该操作会强制他之前的延迟操作立即执行。在这之后,该Stream就不会在被使用了。

1)Stream的创建:

通过Collection实例的stream()产生

Stream<String> stream = new ArrayList<String>().stream();

通过Arrays.stream()产生

Stream<Integer> stream = Arrays.stream(new Integer[10]);

通过Stream.of()产生

Stream<String> stream3 = Stream.of("10","20");

通过迭代器生成Stream.iterate()

Stream<Integer> stream4 = Stream.iterate(0,(x) -> x + 2);

通过生成器生成Stream.generate()

Stream<Double> stream5 = Stream.generate(() -> Math.random());

通过File.lines(path)获取

2)Stream对数据的中间操作:

(1)切片和筛选

filter(筛选):筛选符合条件的数据

limit(截取):截取指定数量的数据

skip(跳过):跳过指定数量的数据

distinct(去重):去掉重复的数据,根据对象的hashCode和equals结果比对两个对象

(2)映射

map-------接受Lambda,将元素转换成其它形式或者提取信息

flatMap---接受Lambda,将流中的每一个元素转换成其它形式或者提取信息

(3)排序

sorted(Comparator com):可以按照默认排序,也可以自定义排序方式

3)Stream的终止操作:

(1)匹配:

allMatch---是否全部匹配

anyMatch---是否至少匹配上一个

noneMatch--是否全不匹配

(2)查找:

findFirst--返回第一个元素

findAny----返回任意一个元素

count------返回元素个数

max--------返回元素最大值

min--------返回元素最小值

(3)规约:

reduce-----数据整合

P_OUT reduce(final P_OUT identity, final BinaryOperator<P_OUT> accumulator)

Optional<P_OUT> reduce(BinaryOperator<P_OUT> accumulator)

(4)收集:

collect(Collector c)---将流收集到指定的收集器中

java8中提供了一个Collectors的工具类用来产生Collector,常用方法有:

toList() 将流中的元素收集到List中

list.stream().collect(Collectors.toList())

toSet() 将流中的元素收集到Set中

list.stream().collect(Collectors.toSet())

toCollection() 将流中的元素收集到创建的集合中

list.stream().collect(Collectors.toCollection(ArrayList::new))

counting() 计算流中元素的个数

list.stream().collect(Collectors.counting())

summingDouble() summingInt() summingLong() 计算流中指定元素的和

list.stream().collect(Collectors.summingInt(Student::getAge))

averagingDouble() averagingInt() averagingLong()  计算流中指定元素的平均值

list.stream().collect(Collectors.averagingDouble(Student::getAge))

summarizingInt() summarizingLong 返回流中的统计信息

list.stream().collect(Collectors.summarizingInt(Student::getAge))

collectingAndThen() 连接处理,在一个处理之后再进行一个处理

list.stream().collect(Collectors.collectingAndThen(Collectors.summarizingInt(Dish::getCalories),a->a.getMax()))

join() 使用指定字符连接流中的每一个元素

list.stream().collect(Collectors.joining(",","--","--"))

groupingBy() 对流中元素根据某一属性进行分组[可以统计出每组的数量]

list.stream().collect(Collectors.groupingBy(Student::getAge))

partitioningBy() 对流中的数据根据true或false进行分区

list.stream().collect(Collectors.partitioningBy(Student::getAge))

并行流与串行流

并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。

Java8中将并行进行了优化,我们可以很容易的对数据进行并行操作。

Stream API可以声明性地通过parallel()与sequential() 在并行流与顺序流之间进行切换。

Optional

Optional是一个容器类,代表一个值存在或不存在.常用方法:

Optional.of(T t): 创建一个Optional实例

Optional.empty(): 创建一个空的Optional实例

Optional.ofNullable(T t):若t不为null,创建Optional实例,否则创建空实例

isPresent(): 判断是否包含值

ifPresent(Consumer c): 判断是否包含值,如果有值,执行此操作

orElse(T t): 如果调用对象包含值,返回该值,否则返回t

orElseGet(Supplier s):如果调用对象包含值,返回该值,否则返回 s 获取的值

map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()

flatMap(Function mapper):与 map 类似,要求返回值必须是Optional

接口的默认方法和静态方法

Java 8使用两个新概念扩展了接口的含义:默认方法和静态方法。

默认方法:

默认方法使用default修饰,实现此接口的类不在强制实现默认的方法

如果一个类继承了一个父类的同时又实现了一个接口,并且类中和接口中存在重名的方法,则采用类优先原则

如果一个类同时实现了两个带有重名default方法的接口,则要求显示实现此方法

接口提供的默认方法可以被接口的实现类继承或者覆写.

静态方法:

静态方法采用static修饰

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

推荐阅读更多精彩内容

  • 为什么使用 Lambda 表达式 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传...
    强某某阅读 14,784评论 0 15
  • Java8新特性 Lambda表达式 概念 lambda表达式是一段可以传递的代码,它的核心思想是将面向对象中的传...
    好好秦先生阅读 821评论 0 1
  • Java 8自Java 5(发行于2004)以来最具革命性的版本。Java 8 为Java语言、编译器、类库、开发...
    谁在烽烟彼岸阅读 884评论 0 4
  • Java 8自Java 5(发行于2004)以来最具革命性的版本。Java 8 为Java语言、编译器、类库、开发...
    huoyl0410阅读 615评论 1 2
  • 目录结构 介绍 Java语言的新特性2.1 Lambdas表达式与Functional接口2.2 接口的默认与静态...
    夜风月圆阅读 459评论 0 2