java-stream流
Stream流
可用于操作集合或数组中的数据
优势:Stream流大量结合了Lambda语法风格编程,代码简介,可读性好
使用步骤
获取Stream流
- 获取集合的stream流
- 获取数组的stream流
public class streamdemo2 {public static void main(String[] args) {//stream流//获取集合的stream流:调用集合提供的stream()方法Collection<String> list = new ArrayList<>();Stream<String> s1 = list.stream();//Map集合获取stream流Map<String,String> map = new HashMap<>();Stream<String> s2 = map.keySet().stream();//获取键流Stream<String> s3 = map.values().stream();//获取值流Stream<Map.Entry<String,String>> s4 = map.entrySet().stream();//获取键值对流//获取数组的流String[] arr = {"张三","李四","王五"};Stream<String> s5 = Arrays.stream(arr);System.out.println(s5.count());Stream<String> s6 = Stream.of("张三","李四","王五");}
}
Stream流的常用(中间)方法
- 中间方法指的是调用完成后会返回新的Stream流,可继续使用(支持链式编程)
public class streamdemo3 {public static void main(String[] args) {//stream流常用的中间方法,对流上数据进行处理(返回新流,支持链式编程)List< String> list = new ArrayList<>();list.add("古月方源");list.add("古月方正");list.add("古月青书");list.add("谢晗沐");list.add("白凝冰");list.add("古月博");//1、过滤方法list.stream().filter(s -> s.startsWith("古月")&&s.length()==4).forEach(System.out::println);//排序方法List<Double> list2 = new ArrayList<>();list2.add(12.3);list2.add(12.5);list2.add(12.1);list2.add(12.7);list2.add(12.4);list2.add(12.2);list2.add(12.2);list2.stream().sorted().forEach(System.out::println);//默认升序System.out.println("-------------------------");list2.stream().sorted((s1,s2)-> Double.compare(s2,s1)).forEach(System.out::println);//降序System.out.println("-------------------------");list2.stream().sorted((s1,s2)-> Double.compare(s2,s1)).limit(2).forEach(System.out::println);//只要前2名System.out.println("-------------------------");list2.stream().sorted((s1,s2)-> Double.compare(s2,s1)).skip(2).forEach(System.out::println);//跳过前2名System.out.println("-------------------------");//若希望自定义对象去重,要重写对象的hashCode和equals方法list2.stream().sorted((s1,s2)-> Double.compare(s2,s1)).distinct().forEach(System.out::println);//去重//加工方法/映射方法:将流中的数据拿出来变成新数据再放到流上list2.stream().map(s -> "加10后:"+(s+10)).forEach(System.out::println);//合并流Stream<String> s1 = Stream.of("张三","李四","王五");Stream<Integer> s2 = Stream.of(1,2,3,4,5);Stream<Object> s3 = Stream.concat(s1,s2);}
}
终结方法
收集stream流
public class streamdemo4 {public static void main(String[] args) {//stream流的统计、收集操作(终结方法)List<People> people = new ArrayList<>();people.add(new People("张三", 18, 5000));people.add(new People("方源", 18, 50000));people.add(new People("王五", 19, 6000));people.add(new People("洪亭", 20, 30000));people.add(new People("武庸", 30, 7000));people.stream().filter(p -> p.getSalary() > 10000).forEach(System.out::println);long count = people.stream().filter(p -> p.getSalary() > 10000).count();System.out.println(count);Optional<People> max = people.stream().max((p1, p2) -> Double.compare(p1.getSalary(), p2.getSalary()));People Maxpeople = max.get();System.out.println(Maxpeople);Optional<People> min = people.stream().min((p1, p2) -> Double.compare(p1.getSalary(), p2.getSalary()));People Minpeople = min.get();System.out.println(Minpeople);System.out.println("------------------------");List< String> list = new ArrayList<>();list.add("古月方源");list.add("古月方正");list.add("古月青书");list.add("谢晗沐");list.add("白凝冰");list.add("古月博");list.add("古月方正");//流只能收集一次//收集到集合或数组中Stream<String> s1 = list.stream().filter(s -> s.startsWith("古月"));List<String> list1 = s1.collect(Collectors.toList());System.out.println(list1);/*Set<String> set1 = new HashSet<>();set1.addAll( list1);*///收集到set集合Stream<String> s2 = list.stream().filter(s -> s.startsWith("古月"));Set<String> set = s2.collect(Collectors.toSet());System.out.println(set);//收集到数组中Stream<String> s3 = list.stream().filter(s -> s.startsWith("古月"));Object[] arr = s3.toArray();System.out.println(Arrays.toString(arr));System.out.println("------------------------");//收集到map集合中,键是老师名字,值是老师薪水Map<String, Double> map = people.stream().collect(Collectors.toMap(People::getName, People::getSalary));System.out.println(map);}
}