1.体验Stream
public static void main(String[] args) { // 1.传统实现方式 ArrayList<String> list = new ArrayList<>(); list.add("张无忌"); list.add("张三丰"); list.add("张曼玉"); list.add("张飞"); list.add("刘晓彤"); list.add("闫云书"); ArrayList<String> list1 = new ArrayList<>(); ArrayList<String> list2 = new ArrayList<>(); for (String s:list){ if (s.startsWith("张")){ list1.add(s); } } for (String s:list1){ if (s.length()>2){ list2.add(s); } } for (String s:list2){ System.out.println(s); } System.out.println("---------------------------"); // 2.Stream改进 list.stream().filter(s->s.startsWith("张")).filter(s->s.length()>2).forEach(System.out::println); }
2.字符流的生成方式
public static void main(String[] args) { // 1.Collections体系的集合可以使用默认方法stream()生成流 ArrayList<String> arrayList = new ArrayList<>(); Stream<String> stream0 = arrayList.stream(); HashSet<String> hashSet = new HashSet<>(); Stream<String> stream1 = hashSet.stream(); // 2.Map体系集合间接生成流 HashMap<String, Integer> hashMap = new HashMap<>(); Set<String> set = hashMap.keySet(); Stream<String> stream2 = set.stream(); Stream<Integer> stream3 = hashMap.values().stream(); Stream<Map.Entry<String, Integer>> stream4 = hashMap.entrySet().stream(); // 3.数组可以通过Stream接口的静态方法of(T...value)生成流 String[] strings = {"大","中","小"}; Stream<String> stream5 = Stream.of(strings); Stream<Integer> stream6 = Stream.of(1, 2, 3); Stream<String> stream7 = Stream.of("李梦瑶", "赵晓燕", "刘晨光"); }
3.Stream常用中间操作
filter:
public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("张无忌"); list.add("张三丰"); list.add("张曼玉"); list.add("张飞"); list.add("刘晓彤"); list.add("闫云书"); // 1.输出list中以张开头的数据 list.stream().filter(s->s.startsWith("张")).forEach(System.out::println); // 2.输出长度为3的数据 list.stream().filter(s->s.length()==3).forEach(System.out::println); // 3.输出list中以张开头长度为3的数据 list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length()==3).forEach(System.out::println); }
limit&skip:
// 1.输出集合前3个数据 list.stream().limit(3).forEach(System.out::println); // 2.跳过集合前3个数据,然后输出后面的数据 list.stream().skip(3).forEach(System.out::println); // 3.跳过前2个,然后输出剩下的数据的前2个 list.stream().skip(2).limit(2).forEach(System.out::println);
concat&distinct:
:(可以理解为去重)
// 1.取出list的前四个数据组成一个流,然后跳过list前两个数据,取出剩下的元素组成一个流 Stream<String> stream1 = list.stream().limit(4); Stream<String> stream2 = list.stream().skip(2); // 2.合并上面两个流并打印出来 Stream.concat(stream1,stream2).forEach(System.out::println); // 3.合并步骤一的两个流,并打印出来,要求输出的字符串不能重复 Stream.concat(stream1,stream2).distinct().forEach(System.out::println);
sorted:
ArrayList<String> list2 = new ArrayList<>(); list2.add("qqqqqqqq"); list2.add("wwwwww"); list2.add("eeee"); list2.add("rrrrr"); list2.add("tttt"); list2.add("yyyy"); // 1.将数据自然排序(按照字母顺序)并输出 list2.stream().sorted().forEach(System.out::println); // 2.按照长度顺序排序,长度相等按照字母顺序排序 // list2.stream().sorted((s1,s2)->s1.length()-s2.length());//只按照长度排序了,长度一样的按照添加顺序排序的 list2.stream().sorted((s1,s2)->{ int num=s1.length()-s2.length(); int num2=num==0?s1.compareTo(s2):num; return num2; });
map&mapToInt:
ArrayList<String> list3 = new ArrayList<>(); list3.add("1"); list3.add("2"); list3.add("3"); list3.add("4"); list3.add("5"); list3.add("6"); // 1.将list中的数据转化为int类型的然后输出 list3.stream().map(s->Integer.parseInt(s)).forEach(System.out::println); list3.stream().map(Integer::parseInt).forEach(System.out::println); list3.stream().mapToInt(Integer::parseInt).forEach(System.out::println); // mapToInt()返回IntStream类型的流,该类有一个特有方法:int sum() 返回此流中元素的总和。 int sum = list3.stream().mapToInt(Integer::parseInt).sum(); System.out.println(sum);
4.Stream流常见终结操作
ArrayList<String> list = new ArrayList<>(); list.add("张无忌"); list.add("张三丰"); list.add("张曼玉"); list.add("张飞"); list.add("刘晓彤"); list.add("闫云书"); // 1.将集合list所有元素在控制台输出 list.stream().forEach(System.out::println); // 2.统计list集合有多少以"张"开头的数据,并输出统计结果 long count = list.stream().filter(s -> s.startsWith("张")).count(); System.out.println(count);
5.练习
public class ActorDemo { public static void main(String[] args) { ArrayList<String> manList = new ArrayList<>(); manList.add("周星驰"); manList.add("成龙"); manList.add("周润发"); manList.add("刘德华"); manList.add("卓比林"); manList.add("郭德纲"); ArrayList<String> womanList = new ArrayList<>(); womanList.add("林青霞"); womanList.add("李沁"); womanList.add("林黛玉"); womanList.add("巩俐"); womanList.add("宋祖英"); womanList.add("范冰冰"); womanList.add("关晓彤"); // 1.男演员只要名字为三个字的前三个 Stream<String> stream = manList.stream().filter(s -> s.length() == 3).limit(3); // 2.女演员只要姓林的,并且不要第一个 Stream<String> stream1 = womanList.stream().filter(s -> s.startsWith("林")).skip(1); // 3.把过滤后的男演员女演员合并 Stream<String> concat = Stream.concat(stream, stream1); // 4.把上一步的操作后的元素作为构造方法的参数创建演员Actor对象,并遍历 concat.map(Actor::new).forEach(actor -> System.out.println(actor.getName())); // 上面四步合并成一步 Stream.concat(manList.stream().filter(s -> s.length()==3).limit(3),womanList.stream().filter(s -> s.startsWith("林")).skip(1)).map(Actor::new).forEach(actor -> System.out.println(actor.getName())); } }
6.Stream流的收集操作
public class CollectDemo { public static void main(String[] args) { ArrayList<String> womanList = new ArrayList<>(); womanList.add("林青霞"); womanList.add("李沁"); womanList.add("林黛玉"); womanList.add("巩俐"); womanList.add("宋祖英"); womanList.add("范冰冰"); womanList.add("关晓彤"); // 1.获得名字长度为3的流,并收集到新的List中和set中 Stream<String> stream = womanList.stream().filter(s -> s.length() == 3); List<String> list = stream.collect(Collectors.toList()); for (String s : list) { System.out.println(s); } Stream<String> stream2 = womanList.stream().filter(s -> s.length() == 3); Set<String> set = stream2.collect(Collectors.toSet()); for (String s : set) { System.out.println(s); } String actor[] = {"林青霞,30", "张曼玉,29", "李沁,17"}; // 1.得到字符串数组中年龄大于28的流 Stream<String> actorStream = Stream.of(actor); Stream<String> stringStream = actorStream.filter(s -> Integer.parseInt(s.split(",")[1]) > 28); // 2.把上面流的数据收集到map集合,姓名做键,年龄做值 Map<String, String> map = stringStream.collect(Collectors.toMap(s -> s.split(",")[0], s -> Integer.parseInt(s.split(",")[1]))); Set<String> keySet = map.keySet(); for (String s : keySet) { System.out.println(s + map.get(s)); } } }