刚学完java8的新特性,留下demo做个记录
package com.demo.controller; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; public class StreamDemo { public static void main(String[] args) { /** * 集合条件筛选出名字是三个字并且姓叶的 */ List<String> list = new ArrayList<>(10); list.add("张小凡"); list.add("叶凡"); list.add("帝释天"); list.add("萧炎"); list.add("林动"); list.add("叶文"); //传统写法 for(String name :list){ if(!name.isEmpty() && name.length() == 3 && name.startsWith("叶")){ System.out.println(name); } } /////////////////////////////////////////////////////////////////////////////////////////////// /**Stream的更优写法 * 1,三个字的 * 2,姓叶的 * 3打印 * 流式处理思想:先找到三个字的 -> 再找到姓叶的 -> 分别进行打印 */ list.stream().filter(s ->s.length()==3).filter(s -> s.startsWith("叶")).forEach(System.out::println); /** * java 8 全新引入Stream Api核心接口:java.util.stream.Stream<T> * 获取流的三种常用方法 * 1,通过collection,直接调用Stream()方法 * 2,通过Map:并不是collection的子接口,而且期中是一对一对的,不能直接获取,间接转换成集合然后获取流 * 3,通过数组,通过Arrays.stream方法(推荐使用这个,会自动识别哪种重载形式),或者Stream.of方法 */ //1 Collection<String> collection = new ArrayList<>(); collection.stream(); //2 Map<String,String> map = new HashMap<>(); //获取所有的键对应的流 Stream<String> streamKey = map.keySet().stream(); //获取所有的流对应的值 Stream<String> streamVal = map.values().stream(); //获取所有键值对对应的流 Stream<Map.Entry<String, String>> stream = map.entrySet().stream(); //3 String[] arry ={"大王","小王"}; Stream<String> stream1 = Arrays.stream(arry); Stream<String> arry1 = Stream.of(arry); /////////////////////////////////////////////////////////////////////////////////////////// } } /** * 常用的Stream流的方法 * filter过滤方法,参数必须是一个predicate接口实现(也就是能产生boolean结果的过虑规则) * 方法的调用会返回一个全新的Stream接口,原来的不变 * Stream是一次性使用的,每次调用之后都会返回一个新的Stream接口实例 */ class StreamFilterDemo{ public static void main(String[] args) { List<String> list = new ArrayList<>(10); list.add("张小凡"); list.add("叶凡"); list.add("叶无道"); list.add("萧炎"); list.add("林动"); list.add("叶文"); //获取流 Stream<String> stream = list.stream(); //参数必须是一个predicate(也就是能产生boolean结果的过虑规则) // Stream<String> result = stream.filter(s -> s.contains("叶")); //一个Stream只能使用唯一的一次,用后即销毁,所以两次调用会报错 // Stream<String> result2 = stream.filter(s -> s.contains("叶")); //多个条件采用链式方法 Stream<String> stringStream = stream.filter(s -> s.contains("叶")).filter(s -> s.length() == 2); } } /** * Count方法 * 统计元素个数,返回的不是接口自身,而是原素个数 */ class StreamCountDemo{ public static void main(String[] args) { List<String> list = new ArrayList<>(10); list.add("张小凡"); list.add("叶凡"); list.add("叶无道"); list.add("萧炎"); list.add("林动"); list.add("叶文"); //获取流 Stream<String> stream = list.stream(); long count = stream.filter(s -> s.length() ==2).count(); System.out.println(count); } } /** * limit方法 * 获取前n个元素 * 参数:需要获取的元素个数(前几个) * 返回值:Stream接口 */ class StreamLimitDemo{ public static void main(String[] args) { List<String> list = new ArrayList<>(10); list.add("张小凡"); list.add("叶凡"); list.add("叶无道"); list.add("萧炎"); list.add("林动"); list.add("叶文"); //获取流 Stream<String> stream = list.stream(); //获取的是有序的前几个 stream.limit(3).forEach(System.out::println); } } /** * Skip方法 * 跳过前几个 * 参数:需要跳过的参数个数 * 返回值:Stream接口 */ class StreamSkipDemo{ public static void main(String[] args) { List<String> list = new ArrayList<>(10); list.add("张小凡"); list.add("叶凡"); list.add("叶无道"); list.add("萧炎"); list.add("林动"); list.add("叶文"); //获取流 Stream<String> stream = list.stream(); //跳过前3个 stream.skip(3).forEach(System.out::println); } } /** * Map方法,在流当中进行映射操作 * 参数:是一个Function<T,R>接口 * 返回值:Stream接口 */ class StreamMapDemo{ public static void main(String[] args) { List<String> list = new ArrayList<>(10); list.add("10"); list.add("20"); list.add("30"); list.add("40"); list.add("50"); list.add("60"); //String转int list.stream().map(Integer::valueOf).forEach(System.out::println); } } /** * Concat 合并流方法 * 注意:这个方法是Stream接口中的静态方法,可以静态调用 */ class StreamConcatDemo{ public static void main(String[] args) { String[] array1 = {"大", "中", "小"}; String[] array2 = {"上", "中", "下"}; //合并两个数组的元素 Stream<String> streamArry1 = Stream.of(array1); Stream<String> streamArry2 = Stream.of(array2); Stream.concat(streamArry1,streamArry2).forEach(System.out::println); } } /** * ForEach方法 对流中元素进行逐一消费 */ class StreamForEachDemo{ public static void main(String[] args) { String[] array ={"上","下","左","右","中"}; //第一种方法 Stream.of(array).forEach(System.out::println); //第二种方法 Stream.of(array).forEach(StreamForEachDemo::method); } public static void method(String str){ System.out.println("测试2:"+str); } } /** * 获取并发的流(多线程执行) * 第一种方法:直接获取并发流 parallelStream * 第二种方法:先获取普通流再变成并流 * */ class StreamP{ public static void main(String[] args) { List<String> list =new ArrayList<>(); for (int i = 0; i < 100; i++) { list.add("str:"+i); } //方法一:parallelStream list.parallelStream().forEach(System.out::println); //方法二:先获取普通流stream,再变成并发流parallel list.stream().parallel().forEach(System.out::println); } } /** * Stream收集结果转集合 * 调用Collectors工具类的方法实现 */ class StreamCollectDemo{ public static void main(String[] args) { String[] array = {"哈哈","喔喔","哦哦"}; //结果转list List<String> collect = Stream.of(array).collect(Collectors.toList()); //结果转set Set<String> collect1 = Stream.of(array).collect(Collectors.toSet()); } } /** * Stream结果转数组 * toArray方法 */ class StreamArrayDemo{ public static void main(String[] args) { //方法一 这种写法返回的是一个object类型无法返回具体泛型 Object[] objects = Stream.of("A", "B", "C").toArray(); //方法二 返回指定类型的数组 String[] strings = Stream.of("A", "B", "C").toArray(String[]::new); } }