1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
| StreamTest:
package com.fluffysponge;
import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream;
/** * 现在有两个ArrayList集合,分别存储6名男演员名称和6名女演员名称,要求完成如下的操作: * 1.男演员只要名字为3个字的前三人 * 2.女演员只要姓林的,并且不要第一个 * 3.把过滤后的男演员姓名和女演员姓名合并到一起 * 4.把上一步操作后的元素作为构造方法的参数创建演员对象,遍历数据 * 演员类Actor已经提供,里面有一个成员变量,一个带参构造方法,以及成员变量对应的get/set方法 */
/* * Stream流的收集方法 * R collect (Collector collector) * 它是通过工具类Collectors提供了具体的收集方式 * public static <T> Collector toList():把元素收集到List集合中 * public static <T> Collector toSet():把元素收集到Set集合中 * public static Collector toMap(Function keyMapper,Function valueMapper):把元素收集到Map集合中 * */
public class StreamTest { 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("王祖贤");
// //男演员只要名字为3个字的前三人 // Stream<String> manStream = manList.stream().filter(s -> s.length() == 3).limit(3); // // //女演员只要姓林的,并且不要第一个 // Stream<String> womanStream = womanList.stream().filter(s -> s.startsWith("林")).skip(1); // // //把过滤后的男演员姓名和女演员姓名合并到一起 // Stream<String> stream = Stream.concat(manStream, womanStream); // // //把上一步操作后的元素作为构造方法的参数创建演员对象,遍历数据 //// stream.map(Actor::new).forEach(System.out::println); // stream.map(Actor::new).forEach(p -> System.out.println(p.getName()));
Stream.concat(manList.stream().filter(s->s.length() == 3).limit(3), womanList.stream().filter(s->s.startsWith("林")).skip(1)). map(Actor::new). forEach(p -> System.out.println(p.getName()));
System.out.println("--------"); //////////////////////////////////////////////////////////////////////////////////////////
//Stream 收集功能
//创建List对象,这个直接使用上面已有的 //需求1: 得到名字为3个字的流 Stream<String> manListStream = manList.stream().filter(s -> s.length() == 3);
//需求2:把使用Stream流操作完毕的数据收集到List集合中并遍历 List<String> names = manListStream.collect(Collectors.toList()); for(String name :names){ System.out.println(name); } System.out.println("--------");
//创建Set集合对象 Set<Integer> set = new HashSet<>(); set.add(10); set.add(20); set.add(30); set.add(33); set.add(35);
//需求3:得到年龄大于25的流 Stream<Integer> setStream = set.stream().filter(age -> age > 25); //需求4:把使用Stream流操作完毕的数据收集到Set集合中并遍历 Set<Integer> ages = setStream.collect(Collectors.toSet()); for(Integer age :ages){ System.out.println(age); } System.out.println("--------");
//定义一个字符串数组,每一个字符串数据由姓名数据和年龄数据组合而成 String[] strArray = {"林青霞,30","张曼玉,35","王祖贤,33","柳岩,25"}; //需求5:得到字符串中年龄数据大于28的流 Stream<String> arrayStream = Stream.of(strArray).filter(s -> Integer.parseInt(s.split(",")[1]) > 28);
//需求6:把使用Stream流操作完毕的数据收集到Map集合中并遍历,字符串中的姓名作键,年龄作值 Map<String, Integer> map = arrayStream.collect(Collectors.toMap(s -> s.split(",")[0], s -> Integer.parseInt(s.split(",")[1]))); Set<String> keySet = map.keySet(); for(String key : keySet){ Integer value = map.get(key); System.out.println(key + "," + value); } } }
Actor:
package com.fluffysponge; /* * 演员类 * */ public class Actor { private String name;
public Actor() { }
public Actor(String name) { this.name = name; }
public String getName() { return name; }
public void setName(String name) { this.name = name; } }
|