在对一个集合通过流处理完后,我们需要回去流处理的结果,这时我们就可以使用一系列方法进行获取。
注意:使用终结方法后,这个流将关闭,不允许再被使用。
代码就是最好的学习方式,下面请看代码:
package StreamStudy.Exa04;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 流的终结:从流中获取结果集
* 涉及的API:count,max,min,collect,findFirst,findAny,anyMatch,allMatch,noneMatch
*/
public class StreamEnd {
public static void main(String[] args) {
String content="hello world wo cao ni ma ma ni wo";
String[] contents=content.split("\\PL+");
Stream<String> words= Stream.of(contents);
//如何从流数据中获得的答案,流的约简是方式之一,约简就是获得流里数据集的统计级别的信息
//获取流中的元素个数
long count=words.count();
System.out.println("流words中元素个数为:"+count);
//获得流中最大值和最小值 compareToIgnoreCase() 方法用于按字典顺序比较两个字符串,不考虑大小写
Optional<String> max=Stream.of(contents).max(String::compareToIgnoreCase);
System.out.println(max.get());
Optional<String> min=Stream.of(contents).min(String::compareToIgnoreCase);
System.out.println(min.get());
//Optional类型是一种更好的表示缺少返回值的方式,它是一种包装器对象,要么包装了类型T的对象,要么没有包装任何对象
//有效的使用Optional的关键是要使用这样一个方法:它在值不存在的情况下会产生一个可替代物
Optional<String> test=Stream.of(contents).filter(s->s.length()<1).findFirst();
String result=test.orElse("我是替代字符串");
System.out.println(result);
//我们还可以调用代码来计算默认值
String result2=test.orElseGet(()-> Locale.getDefault().getDisplayName());
System.out.println(result2);
//我们还可以在没有任何值的情况下抛出异常
//String result3=test.orElseThrow(IllegalAccessError::new);
//有效使用Optional的另一种方法是只有在其存在的情况下才消费该值
List<String> result4=new ArrayList<>();
test.ifPresent(result4::add);
System.out.println(result4.size());
//如果我们想要获得流中随机的一个元素我们可以使用findAny元素
Optional<String> findAny=Stream.of(contents).findAny();
System.out.println(findAny);
//如果我们想要提取流中的元素组成列表我们可以
List<String> list=Stream.of(contents).collect(Collectors.toList());
//如果只想知道是否存在匹配的值,可以使用anyMatch
boolean flag=Stream.of(contents).anyMatch(s->s.equals("hello"));
System.out.println(flag);
//如果想知道是否所有元素都满足某个条件可以使用allMatch
flag=Stream.of(contents).allMatch(s->s.equals("hello"));
System.out.println(flag);
flag=Stream.of(contents).noneMatch(s->s.equals("000"));
System.out.println(flag);
}
}