一、创建Stream
/*
创建stream
*/
@Test
public void test2(){
//一次是 list集合,数组,Stream静态方法of(),普通对象stream.filter过滤
List<String> ls = new ArrayList<>();
Stream<String> ss = ls.stream();
Employee [] emarr = new Employee[10];
Stream<Employee> esarr = Arrays.stream(emarr);
Stream<String> stringStream = Stream.of("1","2","3");
Stream<Integer> integerStream = Stream.iterate(0,(x)->x+2);
integerStream.limit(10).forEach(System.out::println);
Stream.generate(()->Math.random()).limit(10).forEach(System.out::println);
Stream<Employee> ess = es.stream().filter(e->{
System.out.println("filter...");
return e.getAge()>1;
});
//这终止操作:一次性执行全部内容“惰性求值”;
ess.forEach(System.out::println);
//外部迭代
Iterator<Employee> it = es.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
}
二、map与flatmap 的区别
Map和flatMap的区别:
1.map---接受Lamda,将元素转换成其他形式或提取信息,
该函数会被应用到每个元素,并将其映射成一个新的元素。
2.flatmap---接收一个函数作为参数,将流中的每个值
都换成顶一个流,然后把所有流转换成一个流。
三、stream 的常用方法
allMatch:检查是否匹配所有元素。
anyMatch:检查是否至少匹配一个元素。
noneMatch:检查是否没有匹配所有元素。
findFirst:返回第一个元素。
fildAny:返回当前流中的任意元素。
Count:返回流中元素的总个数。
Max:返回流中的最大值。
Min:返回流中的最小值。
归约:reuce(T ientity,BinaryOperator)/reduce(BinaryOperator)可以将流中元素反复结合起来,得到一个值。
//实体类中的一个属性:
private Status Status;
public enum Status{
FREE,
BUSY,
VOCATION;
}
@Test
public void test1() {
boolean b1 = emps.stream().allMatch((e) -> e.getStatus().equals(Employee.Status.BUSY));
boolean b2 = emps.stream().anyMatch(e -> e.getStatus().equals(Employee.Status.FREE));
System.out.println(b1);
System.out.println("-------------");
System.out.println(b2);
System.out.println("-------------");
boolean b3 = emps.stream().noneMatch((e) -> e.getStatus().equals(Employee.Status.BUSY));
System.out.println(b3);
System.out.println("-------------");
Optional<Employee> op = emps.stream().sorted(Comparator.comparingInt(Employee::getAge)).findAny();
System.out.println(op.get());
Optional<Employee> op1 = emps.stream().max(Comparator.comparingInt(Employee::getAge));
System.out.println(op1);
Optional<Integer> op2 = emps.stream().map(Employee::getAge).min(Integer::compare);
System.out.println(op2);
}
三、使用stream拆分字符串为单个字符
List<Employee> es = Arrays.asList(
new Employee(3,"3",3),
new Employee(1,"1",1),
new Employee(4,"4",1),
new Employee(2,"2",2)
);
@Test
public void test2(){
List<String> s =Arrays.asList("1as","2v","3f","4hm");
// s.stream().map((str)->str.toUpperCase()).forEach(System.out::println);
// es.stream().map(Employee::getAge).forEach(System.out::println);
//拆分字符串为单个字符
Stream<Stream<Character>> streamStream = s.stream().map(demo3::filterCharacter);
streamStream.forEach((sm)->sm.forEach(System.out::println));
}
public static Stream<Character> filterCharacter(String str){
//集合的add方法和addAll方法的区别 :addAll把 集合的全部内容加进去。
// 比如list,那么包含list格式的信息,都会加进去。
List<Character> ls = new ArrayList<>();
for (Character c : str.toCharArray()) {
ls.add(c);
}
return ls.stream();
}
四、排序sorted
@Test
public void test2(){
//自然排序
List<String> ls = Arrays.asList("zzzz","aa","ccc","ddd");
ls.stream().sorted().forEach(System.out::println);
//定制排序
es.stream().sorted((e1,e2)->{
if(e1.getAge()==e2.getAge()){
return e1.getName().compareTo(e2.getName());
}else{
return Integer.compare(e1.getAge(),e2.getAge());
}
}).forEach(System.out::println);
}