List、Set 集合取第一个对象 (Optional、Stream)

获取第一个对象

  • 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 的一个方法,能够防止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>   // Stream 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()    // 基本类型装箱

你可能感兴趣的:(list,java)