黑马程序员技术交流社区

标题: 【成都校区】 [打印本页]

作者: Collections    时间: 2018-12-7 12:50
标题: 【成都校区】
函数式编程

Lambda的延迟执行
-性能浪费的日志案例
日志可以帮助我们快速的定位问题,记录程序运行过程中的情况,以便的监控和优化。 一种典型的场景就是对参数进行有条件使用,例如对日志消息进行拼接后,在满足条件的情况下进行打印输出:
public class Demo01Logger {
       private static void log(int level, String msg) {
           if (level == 1) {
               System.out.println(msg);
} }
       public static void main(String[] args) {
           String msgA = "Hello";
           String msgB = "World";
           String msgC = "Java";
           log(1, msgA + msgB + msgC);
       }
}
体验Lambda的更优写法
使用Lambda必然需要一个函数式接口:
  @FunctionalInterface
   public interface MessageBuilder {
       String buildMessage();
       }
然后对 log 方法进行改造:
  public class Demo02LoggerLambda {
       private static void log(int level, MessageBuilder builder){
           if (level == 1) {
               System.out.println(builder.buildMessage());
  }
  }
          public static void main(String[] args){
           String msgA = "Hello";
           String msgB = "World";
           String msgC = "Java";
           log(1, () ‐> msgA + msgB + msgC );
       }
}

证明Lambda的延迟
  public class Demo03LoggerDelay {
       private static void log(int level, MessageBuilder builder){
           if (level == 1) {
               System.out.println(builder.buildMessage());
} }
       public static void main(String[] args) {
           String msgA = "Hello";
           String msgB = "World";
           String msgC = "Java";
log(2, () ‐> { System.out.println("Lambda执行!"); return msgA + msgB + msgC;}); }
}
使用Lambda作为参数和返回值
Java中的Lambda表达式可以被当作是匿名内部类的替代品。如果方法的参数是一个函数式接口类型,那么就可以使用Lambda表达式进行替代。使用Lambda表达式作为方法参数,其实就是使用函数式 接口作为方法参数。
Lambda作为参数
使用Lambda作为参数
    public class Demo_Runnable {
       private static void startThread(Runnable run) {
           new Thread(run).start();
       }
public static void main(String[] args) {
startThread(() ‐> System.out.println("线程任务执行!"));
} }
Lambda作为返回值类型
package com.itcast.hssjk2;

import java.util.Arrays;
import java.util.Comparator;
//函数式接口的使用:函数式接口作为返回值
public class TestComparator {
///定义一个方法,返回值类型使用函数式接口Comparator<T>
    public static Comparator<String> show(){
            //方法一:使用匿名内部类
//        return new Comparator<String>() {
//            @Override
//            public int compare(String o1, String o2) {
//                return o1.length()-o2.length();
//            }
//        };

        //因为返回值是一个函数式接口,所以可以使用lambda表达式
        return (o1, o2) -> o1.length()-o2.length();
    }
    public static void main(String[] args) {
        String[]arr={"aaa","b","cc","ddddddd"};
       System.out.println(Arrays.toString(arr));
        Arrays.sort(arr,show());
       System.out.println(Arrays.toString(arr));
    }
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2