当前位置:   article > 正文

java函数式编程汇总_java四种函数式方法

java四种函数式方法
函数式编程
1.概念:
    面向对象思想需要关注用什么对象完成什么事情。函数式编程思想-关注的是对数据进行了什么操作
2.优点:
    代码简洁,开发快速(消灭大量代码嵌套;);
    代码可读性搞;
    大数据量下处理集合效率高;(易于并发编程)

3.Lambda表达式:让我们不关注什么是对象,关注对数据进行什么操作。本质是个匿名类。可以多看看Swing里面对各种事件监听器的实现。
   
    编写代码方法:先编写匿名内部类,然后ctrl+1转换为lambda
   lambda表达式的省略规则:
       参数类型可以省略
       方法体只有一句代码时大括号return和唯一一句代码的分号可以省略
       方法只有一个参数的小括号可以省略
   
4.stream流:使用函数式编程,用来对集合或数组链状流式进行操作,方便对集合或数组操作
   
    使用stream注意事项:
        惰性求值(如果没有终结操作,没有中间操作是不会得到执行)
        流是一次性的(一旦一个流对象经过一个终结操作后,该流就不能被使用了)
        不会影响原生数据(对流中进行数据处理,不会影响集合中元素)
5.optional:非空操作的判断,避免空指针

6.常见函数式接口:
   Consumer消费接口:对传入的参数进行消费
   Function计算转换接口
    Predicate:判断接口
    Supplier:生产型接口,在get抽象方法中把创建好的对象返回
7.函数接口常用默认方法:
    and 相当于&&(与运算)
    or 相当于||(或运算)
    negate 相当于结果取反 !
8.方法引用
     基本格式:  类名或者对象名称::方法名
           
     引用静态方法    类名::方法名
     引用对象的实例方法  对象名::方法名
     引用类的实例方法 类名::方法名
     构造方法引用 类名::new

9.stream基本类型优化 
   stream提供了专门针对基本数据类型的方法。如:mapToInt,mapToLong,mapToDouble,flatMapToInt,flatMapToDouble 等
10.并行流:利用并行流提高操作效率。本质是把任务分配多线程处理。
   利用parallel():串行流转换为并行流
   利用peek():打印并行流日志
   利用parallelStream():把集合对象直接转换为并行流对象

    
  1. package com.basic;
  2. import lombok.Data;
  3. import lombok.EqualsAndHashCode;
  4. import java.awt.print.Book;
  5. import java.util.List;
  6. /**
  7. * The type Author.
  8. */
  9. @EqualsAndHashCode//用于去重
  10. @Data
  11. public class Author {
  12. private Long id;
  13. private String name;
  14. private int age;
  15. private String intro;
  16. private List<Book> books;
  17. }
  18. package com.basic;
  19. import lombok.Data;
  20. import lombok.EqualsAndHashCode;
  21. @EqualsAndHashCode
  22. @Data
  23. public class Book {
  24. private Long id;
  25. private String name;
  26. private String category;
  27. private int score;
  28. private String intro;
  29. }
  30. package com.basic;
  31. import java.util.function.IntBinaryOperator;
  32. import java.util.function.IntConsumer;
  33. import java.util.function.IntPredicate;
  34. public class Lamda1 {
  35. public static int calculateNum(IntBinaryOperator operator){
  36. int a=10;
  37. int b=5;
  38. return operator.applyAsInt(a,b);
  39. }
  40. public static void printNum(IntPredicate predicate){
  41. int[] arr={1,2,3,4,5};
  42. for(int i:arr){
  43. if(predicate.test(i)){
  44. System.out.println(i);
  45. }
  46. }
  47. }
  48. public static void foreachArr(IntConsumer consumer){
  49. int[] arr={1,2,3,4,5};
  50. for(int i:arr){
  51. consumer.accept(i);
  52. }
  53. }
  54. public static void main(String[] args) {
  55. // new Thread(() -> System.out.println("#########")).start();
  56. // int sum=calculateNum((left, right) -> left+right);
  57. // System.out.println(sum);
  58. //
  59. // printNum(value -> value%2==0);
  60. foreachArr(value -> System.out.println(value));
  61. }
  62. }
  63. package com.basic;
  64. import lombok.Data;
  65. import lombok.NoArgsConstructor;
  66. import java.util.*;
  67. import java.util.function.BinaryOperator;
  68. import java.util.function.Consumer;
  69. import java.util.function.Function;
  70. import java.util.function.Predicate;
  71. import java.util.stream.Stream;
  72. import static java.util.Arrays.asList;
  73. import static java.util.stream.Collectors.toList;
  74. /**
  75. * The type Stream 1.
  76. */
  77. @NoArgsConstructor
  78. @Data
  79. public class Stream1 {
  80. /**
  81. * The entry point of application.
  82. *
  83. * @param args the input arguments
  84. */
  85. public static void main(String[] args) {
  86. List<Integer> aa = new ArrayList<>();
  87. aa.add(3);
  88. aa.add(8);
  89. aa.add(3);
  90. aa.stream()
  91. .distinct().filter(integer -> integer > 4).forEach(integer -> System.out.println("consuer:" + integer));
  92. //不大于 negate()
  93. aa.stream().filter(((Predicate<Integer>) input -> input > 4).negate()).forEach(input -> System.out.println("不大于4的数据:" + input));
  94. //parallelStream():把集合对象直接转换为并行流对象,提高执行效率
  95. aa.parallelStream().filter(((Predicate<Integer>) input -> input > 4).negate()).forEach(input -> System.out.println("不大于4的数据:" + input));
  96. //mapToInt 优化执行效率
  97. aa.stream().mapToInt(value -> value).map(operand -> operand + 10).forEach(System.out::println);
  98. //单列集合
  99. Stream<Integer> stream = aa.stream();
  100. stream.forEach(integer -> System.out.println(integer));
  101. //双列集合:转换成单列集合后再创建
  102. HashMap<String, Integer> m = new HashMap<>();
  103. m.put("小新", 19);
  104. m.put("小新2", 139);
  105. m.put("小新4", 169);
  106. Stream<Map.Entry<String, Integer>> stream1 = m.entrySet().stream();
  107. System.out.println("map size:" + stream1.count());
  108. Set<Map.Entry<String, Integer>> entries = m.entrySet();
  109. Stream<Map.Entry<String, Integer>> stream2 = entries.stream();
  110. stream2.filter(stringIntegerEntry -> stringIntegerEntry.getValue() > 20).forEach(mm -> System.out.println(mm.getKey() + ":" + mm.getValue()));
  111. //最大值
  112. List<Integer> kk = Stream.of(aa, asList(6, 1, 3)).flatMap((Function<List<Integer>, Stream<Integer>>) integers -> integers.stream()).collect(toList());
  113. System.out.println("max:" + kk.stream().max((o1, o2) -> o1 - o2).get());
  114. //count:获取元素中的个数
  115. ArrayList<String> strings = new ArrayList<>();
  116. strings.add("b");
  117. strings.add("kk");
  118. System.out.println("count:" + strings.stream().count());
  119. //collect把流中元素转换成集合
  120. List<String> collect = strings.stream().collect(toList());
  121. System.out.println("collect:" + collect);
  122. //reduce对元素求和
  123. System.out.println("合计:" + Stream.of(1, 23, 4).reduce((integer, integer2) -> integer + integer2).get());
  124. //map 对流中元素进行计算或者转换
  125. aa.stream().sorted((o1, o2) -> {
  126. return o2 - o1; //确定升降级
  127. }).map(new Function<Integer, String>() {
  128. @Override
  129. public String apply(Integer integer) {
  130. return integer.toString() + "ok";
  131. }
  132. }).forEach(s -> System.out.println("s:" + s));
  133. //limit设置流的最大长度,超出抛出异常
  134. aa.stream().limit(2).forEach(new Consumer<Integer>() {
  135. @Override
  136. public void accept(Integer integer) {
  137. System.out.println("in:" + integer);
  138. }
  139. });
  140. //跳过流中的n个元素,返回剩下的元素
  141. aa.stream().skip(2).forEach(new Consumer<Integer>() {
  142. @Override
  143. public void accept(Integer integer) {
  144. System.out.println("i:" + integer);
  145. }
  146. });
  147. //anyMatch 任意匹配的返回true
  148. System.out.println("anymatch result:" + aa.stream().anyMatch(new Predicate<Integer>() {
  149. @Override
  150. public boolean test(Integer integer) {
  151. return integer > 4;
  152. }
  153. }));
  154. //allMatch:判断是否都符合匹配条件,符合返回true
  155. System.out.println("allMatch result:" + aa.stream().allMatch(new Predicate<Integer>() {
  156. @Override
  157. public boolean test(Integer integer) {
  158. return integer > 4;
  159. }
  160. }));
  161. //noneMatch:判断流中元素都不符合匹配条件。如果都不符合返回true
  162. System.out.println("noneMatch result:" + aa.stream().noneMatch(new Predicate<Integer>() {
  163. @Override
  164. public boolean test(Integer integer) {
  165. return integer > 9;
  166. }
  167. }));
  168. //findAny:获取流中任意一个元素。该方法没办法保证获取的一定是流中第一个元素
  169. System.out.println("findAny result:" + aa.stream().findAny().get());
  170. //findFirst:获取流中第一个元素
  171. System.out.println("findFirst:" + aa.stream().findFirst().get());
  172. //reduce求最大值
  173. System.out.println("reduce求最大值:" + aa.stream().reduce(Integer.MIN_VALUE, new BinaryOperator<Integer>() {
  174. @Override
  175. public Integer apply(Integer result, Integer ele) {
  176. return result < ele ? ele : result;
  177. }
  178. }));
  179. //reduce求和
  180. System.out.println("reduce:求和:" + aa.stream().reduce(0, new BinaryOperator<Integer>() {
  181. @Override
  182. public Integer apply(Integer result, Integer ele) {
  183. return result + ele;
  184. }
  185. }));
  186. //optional非空判断
  187. Integer ara = null;
  188. Optional<Integer> ara1 = Optional.ofNullable(ara);
  189. ara1.ifPresent(value -> {
  190. System.out.println(value);
  191. });
  192. //null输出默认值
  193. System.out.println(ara1.orElse(111));
  194. Stream<Integer> stream3 = Stream.of(1, 3, 5, 6, 10);
  195. System.out.println("串行流操作:" + stream3.filter(num -> num > 5).reduce((reuslt, input) -> reuslt + input).get());
  196. Stream<Integer> stream4 = Stream.of(1, 3, 5, 6, 10);
  197. System.out.println("并行流操作:" + stream4.parallel().peek(num -> System.out.println("打印执行日志" + num + Thread.currentThread().getName())).filter(num -> num > 5).reduce((reuslt, input) -> reuslt + input).get());
  198. System.out.println("helloBBB");
  199. }
  200. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/903769
推荐阅读
相关标签
  

闽ICP备14008679号