乐趣区

关于java:函数式接口

函数式接口

有且仅有一个形象办法的接口
@FunctionalInterface 函数式接口

// 形象办法
void show();
// 函数式接口做局部变量
MyInterface my = () -> sout("函数式接口");
my.show();

函数式接口作为办法的参数

public static void startThread(Runnable r){new Thread(r).start();}
// 在主办法中调用 startThread 办法
// 匿名外部类的形式
startThread(new Runnable() {
      @Override
      public void run() {System.out.println("线程启动了");
      }
});

// 用 lambda 表达式改良
startThread(() -> sout("程启动了"));

函数式接口作为办法的返回值

public static Comparator<String> getComparator(){
    // 返回的是接口的实现类对象
    // 匿名外部类的形式
    Comparator<String> comp = new Comparator<String>(){
        @Override
        public int compare(String s1,String s2) {return s1.length()-s2.length();}
    };
    return comp;
    
    // 用 lambda 表达式改良
    return (String s1,String s2) -> {return s1.length()-s2.length();};
    // 再优化
    return (s1,s2) -> s1.length()-s2.length();
}

// 主程序 结构应用的场景
// 定义汇合 存储字符串元素
ArrayList<String> array = new ArrayList<String>();
array.add("cccc");
array.add("aa");
array.add("b");
array.add("ddd");

sout(array);// 排序前 怎么增加的怎么输入
Collections.sort(array);
sout(array);// 排序后 依照天然程序 abcd 输入
Collections.sort(array,getComparator());
sout(array);// 排序后 依照接口中定义的办法接口进行排序 


罕用的函数式接口

Supplier 接口

// 定义一个办法,返回一个字符串数据
private static String getString(Supplier<String> sup){return sup.get();
}
// 主办法中调用
String s = getString(() -> {return "林青霞";});
// 优化
String s = getString(() -> "林青霞");

练习

// 返回一个 int 数组的最大值
private static int getMax(Supplier<Integer> sup){return sup.get();
}

// 主办法中调用
// 定义一个 int 数组
int[] arr = {19,50,28,37,46};
int maxValue = getMax(() -> {int max= arr[0];
    for (int i = 0; i < arr.length; i++) {if(arr[i]>max){max = arr[i];
        }
    }
});
sout(maxValue);

Consumer 接口





练习



Predicate 接口





negate 是取 非!


and 是短路与

or 是短路或

练习


Function 接口







练习




退出移动版