• 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 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 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) input -> input > 4).negate()).forEach(input -> System.out.println("不大于4的数据:" + input));
    94. //parallelStream():把集合对象直接转换为并行流对象,提高执行效率
    95. aa.parallelStream().filter(((Predicate) 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 stream = aa.stream();
    100. stream.forEach(integer -> System.out.println(integer));
    101. //双列集合:转换成单列集合后再创建
    102. HashMap m = new HashMap<>();
    103. m.put("小新", 19);
    104. m.put("小新2", 139);
    105. m.put("小新4", 169);
    106. Stream> stream1 = m.entrySet().stream();
    107. System.out.println("map size:" + stream1.count());
    108. Set> entries = m.entrySet();
    109. Stream> stream2 = entries.stream();
    110. stream2.filter(stringIntegerEntry -> stringIntegerEntry.getValue() > 20).forEach(mm -> System.out.println(mm.getKey() + ":" + mm.getValue()));
    111. //最大值
    112. List kk = Stream.of(aa, asList(6, 1, 3)).flatMap((Function, Stream>) integers -> integers.stream()).collect(toList());
    113. System.out.println("max:" + kk.stream().max((o1, o2) -> o1 - o2).get());
    114. //count:获取元素中的个数
    115. ArrayList strings = new ArrayList<>();
    116. strings.add("b");
    117. strings.add("kk");
    118. System.out.println("count:" + strings.stream().count());
    119. //collect把流中元素转换成集合
    120. List 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() {
    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() {
    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() {
    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() {
    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() {
    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() {
    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() {
    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() {
    181. @Override
    182. public Integer apply(Integer result, Integer ele) {
    183. return result + ele;
    184. }
    185. }));
    186. //optional非空判断
    187. Integer ara = null;
    188. Optional 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 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 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. }

  • 相关阅读:
    【JAVA程序设计】基于SSM+VUE前后端分离的物流管理系统
    浅看BCEL字节码
    【无标题】
    数据链路层--以太网
    华为云云耀云服务器L实例评测|深度体验云耀云服务器购买和Ubuntu环境性能压力评测
    json转化成Map数据结构,Map转Array
    云数据库 GaussDB(for Influx) 解密第十一期:让智能电网中时序数据处理更高效
    maven依赖找不到的解决:手动下载、多镜像导入。
    使用PySpark计算AUC,KS与PSI
    【网络协议】
  • 原文地址:https://blog.csdn.net/crazy123456789/article/details/126105844