获取第一个对象
- Code
// List 获取第一个对象
List<String> alist = new ArrayList<>();
String a = alist.stream().findFirst().orELse(null);
// Set 获取第一个对象
Set<String> bset = new HashSet<>();
String b = bset.stream().findFirst().orElse(null);
// or
if(bset.iterator.hasNext())
String c = bset.iterator().next();
Optional
orElse() 是jdk8 引入的Optional<T> 的一个方法,能够防止null导致的NullPointerException
- orElse 和 orElseGet 作用都是返回缺省值,并且无论present是否为空它们都会被调用的
- 他们一个是饿汉式,一个是懒汉式 (类似懒加载)
- orElse是无论present是否为空,缺省值都会被加载到内存, 在高并发下慎用
- orElseGet是仅当present为空时,将缺省值加载到内存
Stream Api
不同于流,是 java 8 引入,用来代表任意 Java 对象的序列
特点:
- 它可以“存储”有限个或无限个元素。(元素有可能已经全部存储在内存中,也有可能是根据需要实时计算出来的)
- 一个Stream可以轻易地转换为另一个Stream,而不是修改原Stream本身。
- 真正的计算通常发生在最后结果的获取,也就是惰性计算。
惰性计算的特点是:一个Stream转换为另一个Stream时,实际上只存储了转换规则,并没有任何计算发生。真正的计算通常发生在最后结果的获取,也就是惰性计算。
Stream<BigInteger> naturals = createNaturalStream(); // 不计算
Stream<BigInteger> s2 = naturals.map(BigInteger::multiply); // 不计算
Stream<BigInteger> s3 = s2.limit(100); // 不计算
s3.forEach(System.out::println); // 计算
通常把Stream的操作写成链式操作,代码更简洁:
createNaturalStream()
.map(BigInteger::multiply)
.limit(100)
.forEach(System.out::println);
Stream API的基本用法就是:创建一个Stream,然后做若干次转换,最后调用一个求值方法获取真正计算的结果;
Stream提供的常用操作有:
转换操作:map(),filter(),sorted(),distinct();
合并操作:concat(),flatMap();
并行处理:parallel();
聚合操作:reduce(),collect(),count(),max(),min(),sum(),average();
其他操作:allMatch(), anyMatch(), forEach(), boxed()
sorted() // 排序
distinct() // 去重
skip() // 截取
limit() // 截取
静态方法Stream.concat(stream1, stream2) // 合并
flatMap() // List to Integer Stream<List<Integer>> // Stream<Integer> i = s.flatMap(list -> list.stream()); //每个元素(这里是List)映射为Stream,然后合并成一个新的Stream
parallel() // 并行
count() // 元素个数
max(Comparator<? super T> cp) // 找出最大元素;
min(Comparator<? super T> cp) // 找出最小元素。
sum() // 对所有元素求和;(仅IntStream、LongStream和DoubleStream)
average() // 对所有元素求平均数。(仅IntStream、LongStream和DoubleStream)
boolean allMatch(Predicate<? super T>) // 测试是否所有元素均满足测试条件;
boolean anyMatch(Predicate<? super T>) // 测试是否至少有一个元素满足测试条件。
boxed() // 基本类型装箱
版权声明:本文为howeres原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。