JAVA8你只需要知道这些(4)

来源:互联网 发布:简单视频剪辑软件 编辑:程序博客网 时间:2024/04/29 13:43

     

    java8的Stream写法,让你告别For循环,快点学习起来吧!让你的代码更加的简洁!非常喜欢啊!!!



  1. package Stream;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import java.util.Optional;  
  6. import java.util.UUID;  
  7. import java.util.stream.Collectors;  
  8. import java.util.stream.Stream;  
  9.   
  10. public class TestStream {  
  11.     private List<String> stringList = new ArrayList<String>();  
  12.     /** 
  13.      * 初始化字符串列表 
  14.      */  
  15.     private void initStringList() {  
  16.         stringList.add("zzz1");  
  17.         stringList.add("aaa2");  
  18.         stringList.add("bbb2");  
  19.         stringList.add("fff1");  
  20.         stringList.add("fff2");  
  21.         stringList.add("aaa1");  
  22.         stringList.add("bbb1");  
  23.         stringList.add("zzz2");  
  24.     }  
  25.   
  26.     /** 
  27.      * Filter接受一个predicate接口类型的变量,并将所有流对象中的元素进行过滤。该操作是一个中间操作, 
  28.      * 因此它允许我们在返回结果的基础上再进行其他的流操作 
  29.      * (forEach)。ForEach接受一个function接口类型的变量,用来执行对每一个元素的操作 
  30.      * 。ForEach是一个中止操作。它不返回流,所以我们不能再调用其他的流操作 
  31.      */  
  32.     public void useStreamFilter() {  
  33.         // stream()方法是Collection接口的一个默认方法  
  34.         // Stream<T> filter(Predicate<? super T>  
  35.         // predicate);filter方法参数是一个Predicate函数式接口并继续返回Stream接口  
  36.         // void forEach(Consumer<? super T> action);foreach方法参数是一个Consumer函数式接口  
  37.   
  38.         // 解释:从字符串序列中过滤出以字符a开头的字符串并迭代打印输出  
  39.         stringList.stream().filter((s) -> s.startsWith("a")).forEach(System.out::println);  
  40.     }  
  41.     /** 
  42.      * Sorted是一个中间操作,能够返回一个排过序的流对象的视图。流对象中的元素会默认按照自然顺序进行排序, 
  43.      * 除非你自己指定一个Comparator接口来改变排序规则. 
  44.      * 
  45.      * <p> 
  46.      * 一定要记住,sorted只是创建一个流对象排序的视图,而不会改变原来集合中元素的顺序。原来string集合中的元素顺序是没有改变的 
  47.      */  
  48.     public void useStreamSort() {  
  49.         // Stream<T> sorted();返回Stream接口  
  50.         // 另外还有一个 Stream<T> sorted(Comparator<? super T>  
  51.         // comparator);带Comparator接口的参数  
  52.         stringList.stream().sorted().filter((s) -> s.startsWith("a")).forEach(System.out::println);  
  53.   
  54.         // 输出原始集合元素,sorted只是创建排序视图,不影响原来集合顺序  
  55.         stringList.stream().forEach(System.out::println);  
  56.     }  
  57.     /** 
  58.      * map是一个对于流对象的中间操作,通过给定的方法,它能够把流对象中的每一个元素对应到另外一个对象上。 
  59.      * 下面的例子就演示了如何把每个string都转换成大写的string. 
  60.      * 不但如此,你还可以把每一种对象映射成为其他类型。对于带泛型结果的流对象,具体的类型还要由传递给map的泛型方法来决定。 
  61.      */  
  62.     public void useStreamMap() {  
  63.         // <R> Stream<R> map(Function<? super T, ? extends R> mapper);  
  64.         // map方法参数为Function函数式接口(R_String,T_String).  
  65.   
  66.         // 解释:将集合元素转为大写(每个元素映射到大写)->降序排序->迭代输出  
  67.         // 不影响原来集合  
  68.         stringList.stream().map(String::toUpperCase).sorted((a, b) -> b.compareTo(a)).forEach(System.out::println);  
  69.     }  
  70.     /** 
  71.      * 匹配操作有多种不同的类型,都是用来判断某一种规则是否与流对象相互吻合的。所有的匹配操作都是终结操作,只返回一个boolean类型的结果 
  72.      */  
  73.     public void useStreamMatch() {  
  74.         // boolean anyMatch(Predicate<? super T> predicate);参数为Predicate函数式接口  
  75.         // 解释:集合中是否有任一元素匹配以'a'开头  
  76.         boolean anyStartsWithA = stringList.stream().anyMatch((s) -> s.startsWith("a"));  
  77.         System.out.println(anyStartsWithA);  
  78.   
  79.         // boolean allMatch(Predicate<? super T> predicate);  
  80.         // 解释:集合中是否所有元素匹配以'a'开头  
  81.         boolean allStartsWithA = stringList.stream().allMatch((s) -> s.startsWith("a"));  
  82.         System.out.println(allStartsWithA);  
  83.   
  84.         // boolean noneMatch(Predicate<? super T> predicate);  
  85.         // 解释:集合中是否没有元素匹配以'd'开头  
  86.         boolean nonStartsWithD = stringList.stream().noneMatch((s) -> s.startsWith("d"));  
  87.         System.out.println(nonStartsWithD);  
  88.     }  
  89.   
  90.     /** 
  91.      * Count是一个终结操作,它的作用是返回一个数值,用来标识当前流对象中包含的元素数量 
  92.      */  
  93.     public void useStreamCount() {  
  94.         // long count();  
  95.         // 解释:返回集合中以'a'开头元素的数目  
  96.         long startsWithACount = stringList.stream().filter((s) -> s.startsWith("a")).count();  
  97.         System.out.println(startsWithACount);  
  98.   
  99.         System.out.println(stringList.stream().count());  
  100.     }  
  101.     /** 
  102.      * 该操作是一个终结操作,它能够通过某一个方法,对元素进行削减操作。该操作的结果会放在一个Optional变量里返回。 
  103.      */  
  104.     public void useStreamReduce() {  
  105.         // Optional<T> reduce(BinaryOperator<T> accumulator);  
  106.         // @FunctionalInterface public interface BinaryOperator<T> extends  
  107.         // BiFunction<T,T,T> {  
  108.   
  109.         // @FunctionalInterface public interface BiFunction<T, U, R> { R apply(T  
  110.         // t, U u);  
  111.         Optional<String> reduced = stringList.stream().sorted().reduce((s1, s2) -> s1 + "#" + s2);  
  112.   
  113.         // 解释:集合元素排序后->reduce(削减 )->将元素以#连接->生成Optional对象(其get方法返回#拼接后的值)  
  114.         reduced.ifPresent(System.out::println);  
  115.         System.out.println(reduced.get());  
  116.     }  
  117.     /** 
  118.      * 使用并行流 
  119.      * <p> 
  120.      * 流操作可以是顺序的,也可以是并行的。顺序操作通过单线程执行,而并行操作则通过多线程执行. 可使用并行流进行操作来提高运行效率 
  121.      */  
  122.     public void useParallelStreams() {  
  123.         // 初始化一个字符串集合  
  124.         int max = 1000000;  
  125.         List<String> values = new ArrayList<>();  
  126.   
  127.         for (int i = 0; i < max; i++) {  
  128.             UUID uuid = UUID.randomUUID();  
  129.             values.add(uuid.toString());  
  130.         }  
  131.   
  132.         // 使用顺序流排序  
  133.   
  134.         long sequenceT0 = System.nanoTime();  
  135.         values.stream().sorted();  
  136.         long sequenceT1 = System.nanoTime();  
  137.   
  138.         // 输出:sequential sort took: 51921 ms.  
  139.         System.out.format("sequential sort took: %d ms.", sequenceT1 - sequenceT0).println();  
  140.   
  141.         // 使用并行流排序  
  142.         long parallelT0 = System.nanoTime();  
  143.         // default Stream<E> parallelStream() {  
  144.         // parallelStream为Collection接口的一个默认方法  
  145.         values.parallelStream().sorted();  
  146.         long parallelT1 = System.nanoTime();  
  147.   
  148.         // 输出:parallel sort took: 21432 ms.  
  149.         System.out.format("parallel sort took: %d ms.", parallelT1 - parallelT0).println();  
  150.   
  151.         // 从输出可以看出:并行排序快了一倍多  
  152.     }  
  153.   
  154.     public void userCollectStream(){  
  155.         //将  
  156.         Stream<String> stream=Stream.of("a","b","c","d");  
  157.         List<String> list=stream.collect(Collectors.toList());  
  158.         list.forEach(str->System.out.println(str));  
  159.     }  
  160.     public static void main(String[] args) {  
  161.         TestStream example = new TestStream();  
  162.   
  163. //        example.useStreamFilter();  
  164. //        example.useStreamMap();  
  165. //        example.useStreamMatch();  
  166. //        example.useStreamCount();  
  167. //        example.useStreamReduce();  
  168. //        example.useParallelStreams();  
  169.         example.userCollectStream();  
  170.     }  
  171. }  

原创粉丝点击