Java8的简单知识

写代码经常会用到集合的操作,之前对spark有所了解,stream的操作跟spark的算子很相似。感兴趣的可以了解下spark的算子。

只记录大概写法,具体的实战使用即可。

常用的方法:

List list = Lists.newArrayList();

list后面直接跟 .stream()

这个方法后可以跟很多的集合操作的方法 ,如:distinct() 对集合里元素去重 limit(2) 取集合里的前几个元素 filter(y->y>4) 这个是用来过滤的 (写法不止 -> 也可以是类名::方法) map(y->y+1) 对集合内的元素都做+1的操作 forEach(i->sout(i)) 这是个循序

limit 返回 Stream 的前面 n 个元素;skip 则是扔掉前 n 个元素(它是由一个叫 subStream 的方法改名而来) 这个可以用来截取集合

sorted() 排序用

peek()??

parallelStream() 与 Stream() 的区别 考虑以下几点:(Stream和parallelStream,前者是单管,后者是多管)

  1. 是否需要并行?

  2. 任务之间是否是独立的?是否会引起任何竞态条件?

  3. 结果是否取决于任务的调用顺序?

对于问题1,在回答这个问题之前,你需要弄清楚你要解决的问题是什么,数据量有多大,计算的特点是什么?并不是所有的问题都适合使用并发程序来求解,比如当数据量不大时,顺序执行往往比并行执行更快。毕竟,准备线程池和其它相关资源也是需要时间的。但是,当任务涉及到I/O操作并且任务之间不互相依赖时,那么并行化就是一个不错的选择。通常而言,将这类程序并行化之后,执行速度会提升好几个等级。

对于问题2,如果任务之间是独立的,并且代码中不涉及到对同一个对象的某个状态或者某个变量的更新操作,那么就表明代码是可以被并行化的。

对于问题3,由于在并行环境中任务的执行顺序是不确定的,因此对于依赖于顺序的任务而言,并行化也许不能给出正确的结果。

这就是为什么有的地方需要使用parallelStream() 了

Collectors.toMap(x->x,y->y+1,(k1,k2)->k1) 这个方法可以有效的防止key重复 报java.lang.IllegalStateException: Duplicate key异常问题。 覆盖。

在最后接上转换成集合的方法.collect(Collectors.toList())

=======================================================================================
Java8 你还需要了解 Optional<> 几个常用方法 optional.of() optional.get() optional.isPresent() 这个类好处就是空指针能准确定位 记住 Optional.empty() 对这个get() 也会空指针


历史性的转变 Java8 之lamada表达式

划重点: 接口现在还可以拥有 默认方法(即在类没有对方法进行实现时,
其主体为方法提供默认实现的方法)。哪怕有很多默认方法,只要接口只定义了一个抽象方法,它就仍然是一个函数式接口。

测验3.2:函数式接口
下面哪些接口是函数式接口?
public interface Adder{
int add(int a, int b);
}
public interface SmartAdder extends Adder{
int add(double a, double b);
}
public interface Nothing{
}
答案:只有 Adder 是函数式接口。
SmartAdder 不是函数式接口,因为它定义了两个叫作 add 的抽象方法(其中一个是从
Adder 那里继承来的)。
Nothing 也不是函数式接口,因为它没有声明抽象方法。

2.我们把它称为谓词(即一个返回 boolean 值的函数)。

3.我们刚刚展示给你的Lambda表达式有三个部分,如图3-1所示。
 参数列表——这里它采用了 Comparator 中 compare 方法的参数,两个 Apple 。
 箭头——箭头 -> 把参数列表与Lambda主体分隔开。
 Lambda主体——比较两个 Apple 的重量。表达式就是Lambda的返回值了。

如果你去看看新的Java API,会发现函数式接口带有 @FunctionalInterface 的标注(3.4
节中会深入研究函数式接口,并会给出一个长长的列表)。这个标注用于表示该接口会设计成
一个函数式接口。

java.util.function.Predicate 接口定义了一个名叫 test 的抽象方法,它接受泛型T 对象,并返回一个 boolean 。

java.util.function.Consumer 定义了一个名叫 accept 的抽象方法,它接受泛型 T的对象,没有返回( void )。

java.util.function.Function<T, R> 接口定义了一个叫作 apply 的方法,它接受一个泛型 T 的对象,并返回一个泛型 R 的对象。

将流转换为特化版本的常用方法是 mapToInt 、 mapToDouble 和 mapToLong 。这些方法和前
面说的 map 方法的工作方式一样,只是它们返回的是一个特化流,而不是 Stream 。例如,你
可以像下面这样用 mapToInt 对 menu 中的卡路里求和:
int calories = menu.stream()
.mapToInt(Dish::getCalories)
.sum();

IntStream intStream = menu.stream().mapToInt(Dish::getCalories);
Stream stream = intStream.boxed();

要找到 IntStream 中的最大元素,可以调用 max 方法,它会返回一个 OptionalInt :
OptionalInt maxCalories = menu.stream()
.mapToInt(Dish::getCalories)
.max();
现在,如果没有最大值的话,你就可以显式处理 OptionalInt 去定义一个默认值了:
int max = maxCalories.orElse(1);

java 8的

default关键字 在接口中可以定义方法了 也可以有方法体 但是返回值必须是static跟该类的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值