1. 编程范式
1.1. 编程语言分类
命令式编程(Imperative Programming): 专注于”如何去做”,这样不管”做什么”,都会按照你的命令去做。解决某一问题的具体算法实现。
函数式编程(Functional Programming):把运算过程尽量写成一系列嵌套的函数调用。
逻辑式编程(Logical Programming):它设定答案须符合的规则来解决问题,而非设定步骤来解决问题。过程是事实+规则=结果。
1.2. 函数式编程
数式编程是种编程方式,它将电脑运算视为函数的计算,并避免变化状态和可变数据。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。
和指令式编程相比,函数式编程强调函数的计算比指令的执行重要,倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算,而非设计一个复杂的执行过程。
和过程化编程相比,函数式编程里函数的计算可随时调用。
1.3. 特点
纯函数,函数的执行没有副作用也就是没有改变成员变量的值,返回值仅仅依赖于输入参数
可以是高阶函数,函数的参数和返回值都可以是函数。
2. Lambda表达式
2.1. 语法
函数式编程是用表达式或者声明来完成而不是语句来完成:
Lambda表达式:(a,b)->a+b
左边为参数列表,右边为函数体。
2.2. 作用
避免匿名内部类定义过多
可以让你的代码看起来很简洁
去掉了一堆没有意义的代码,只留下核心的逻辑
其实质属于函数式编程的概念
2.3. 示例
示例1:跳过前两个元素循环显示信息并返回集合
products = products.stream() .skip(2) .peek(System.out::println) .collect(Collectors.toList());
ship(2)跳过前两个元素,peek类似forEach但是不“消费”stream,collect收集。
示例2:按着价格从低到高排序,java7的写法:
Collections. sort ( products , new Comparator<Product>() { @Override public int compare(Product o1, Product o2) { return o1.getPrice().compareTo(o2.getPrice()); } });
java8的写法:
Collections. sort ( products ,((o1, o2) -> o1.getPrice().compareTo(o2.getPrice())));
或者
products = products.stream() .sorted((a,b)->a.getPrice().compareTo(b.getPrice())) .collect(Collectors.toList());
示例3:价格最高的类型为2的前三条产品,只打印标题并去重
products.stream() .filter(p->p.getProductType().getId().equals(2)) .sorted((p1,p2)->p2.getPrice().compareTo(p1.getPrice())) .limit(3) .map(Product::getTitle) .distinct() .forEach(System.out::println);
3. lambda表达式引用实例方法
3.1. 无参无返回值
// 无参无返回值 @Test public void testInstanceMethod5(){ Product product = new Product(); //Runnable runnable = ()->product.hello(); Runnable runnable = product::hello; runnable.run(); }
3.2. 无参有返回值
@Test public void testInstanceMethod1(){ Product product = new Product(); product.setId(1); //Function<Product,Integer> funRef = p -> p.getId(); Function<Product,Integer> funRef = Product::getId; // 注意这里的 Product 为类名 Integer id = funRef.apply(product); System. out .println(id); }
或者
@Test public void testInstanceMethod2(){ Product product = new Product(); product.setId(1); Supplier<Integer> supplier = product::getId; // 注意这里的 product 为实例名而不是类名 System. out .println(supplier.get()); }
3.3. 有参无返回值
// 有参无返回值 @Test public void testInstanceMethod4(){ Product product = new Product(); Consumer<Integer> consumer = (id)->product.setId(id); consumer.accept(12); }
3.4. 有参有返回值
@Test public void testInstanceMethod3(){ BiFunction<String,String,Integer> biFunRef = String::indexOf; Integer index = biFunRef.apply( "wanmait" , "it" ); System. out .println(index); }
4. Lambda表达式引用静态方法
假如Product中有以下方法: public static void showInfo(){ System.out.println("wanmait product...........");}public static String getInfo(){ return "wanmait product...";}public static void setInfo(String info){ System.out.println("setInfo......"+info);}public static String sayHello(String name){ return "hello "+name;}public static int add(int a,int b){ return a+b;}
4.1. 无参无返回值
// 无参无返回值 @Test public void testStaticMethod1(){ //Runnable runnable = ()->Product.showInfo(); Runnable runnable = Product:: showInfo ; runnable.run(); }
4.2. 无参有返回值
// 无参有返回值 @Test public void testStaticMethod2(){ //Supplier<String> supplier = ()->Product.getInfo(); Supplier<String> supplier = Product:: getInfo ; System. out .println(supplier.get()); }
4.3. 有参无返回值
// 有参无返回值 @Test public void testStaticMethod3(){ //Consumer<String> consumer = (info)->Product.setInfo(info); Consumer<String> consumer = Product:: setInfo ; consumer.accept( "hello" ); }
4.4. 有一个参数有返回值
// 有参有返回值 @Test public void testStaticMethod4(){ //Function<String,String> function= name->Product.sayHello(name); Function<String,String> function= Product:: sayHello ; System. out .println(function.apply( "wanma" )); }
4.5. 两个参数有返回值
// 有两个参数有返回值 @Test public void testStaticMethod5(){ //BiFunction<Integer,Integer,Integer> biFunction = (a,b)->Product.add(a,b); BiFunction<Integer,Integer,Integer> biFunction = Product:: add ; int result = biFunction.apply(4,5); System. out .println(result); // 或者 BinaryOperator<Integer> binaryOperator = Product:: add ; int result2 = binaryOperator.apply(5,6); System. out .println(result2); }
5. Lambda表达式引用构造函数
// 引用构造函数 @Test public void testConstructor(){ //Supplier<Product> supplier = ()->new Product(); Supplier<Product> supplier = Product:: new ; Product product = supplier.get(); }
0条评论
点击登录参与评论