函数式编程
函数式编程思想:只要能获取结果,谁做的,怎么做的,均无需知道,也不必知道,重视结果,不重视过程;eg:(你想吃炸鸡,只需美团下单,至于饭店如何炸的鸡,骑手如何送的,你均不需要知道,只需要美团下单,等待吃炸鸡)
Lambda表达式
- Lambda表达式是函数式编程思想的一种体现
- Lambda表达式由三部分组成:
1、 一些参数构成
2、->
3、 一段代码 - 函数式编程接口的抽象方法都只有一个
Lambda表达式的标准格式
(参数类型,参数)->{代码段};
Lambda表达式的格式说明
- 参数和传统参数一致,无参数有空,多个参数用分号隔开;
- ->表示指向动作;
- 代码段和传统代码段一致;
Lambda表达式的特殊形式
- (参数列表):数据类型可以省略不写
- (参数列表):参数只有一个时()和参数类型都可不写
- (代码块):如果只有一行代码(return,{}、;)均可不写但注意必须一块省略;
普通代码与Lambda表达式的代码对比
public class Demo01 {
public static void main(String[] args) {
//普通代码
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"新线程创建");
}
}).start();
//Lambda表达式
new Thread(()-> System.out.println(Thread.currentThread().getName()+"新线程创建")).start();
}
}
常用的函数式接口(Java.util.function提供)
Supplier接口
Supplier接口仅包含一个无参的方法:T get()。用来获取参数指定类型的对象数据,
Supplier生产型接口,Supplier接口中泛类型是啥类型,get()方法返回啥类型
代码展示
public class Demo02 {
public static void main(String[] args) {
String str=getString(()->"胡歌");
System.out.println(str);
}
public static String getString(Supplier<String> sup){
return sup.get();
}
}
Consumer接口
Consumer接口消费型接口,意为消费一个指定泛型的数据,包含 void accept(T)
代码展示
public class demo03 {
public static void main(String[] args) {
String str="胡歌";
method(str,(str1)-> System.out.println(str));
}
public static void method(String str,Consumer<String> cn)
{
cn.accept(str);
}
}
Predicate接口
Predicate接口中包含一个抽象方法:boolean test(T t),其中默认的方法有 and 、or
代码展示
public class demo04 {
public static void main(String[] args) {
method("afafaf",(str)->{
if(str.length()>5){
return true;
}
return false;
});
}
public static void method(String str, Predicate<String> pr)
{
boolean test = pr.test(str);
System.out.println("这个字符长吗:"+test);
}
}
Function接口
Function接口根据一个类型的数据得到另一个类型的数据,前者为前置条件,后者为后置条件主要抽象方法 R
apply(T t)默认方法andThen();
以上四个接口主要用于Stream流的方法中
- Consumer接口用于Stream流中的forEach()方法
- predicate接口用于Stream流中的filter()方法
- Function接口用于Stream流中的map()方法
public class demo01 {
public static void main(String[] args) {
Stream<String> stream = Stream.of("1", "2", "3", "4");
Stream<String> stream2 = Stream.of("5", "8");
//Stream的forEach方法,打印
//stream.forEach(str-> System.out.println(str));
//Stream的filter,过滤
//Stream<String> stream1 = stream.filter(str -> str.length() == 3);
//stream1.forEach(str-> System.out.println(str));
//Stream的map方法,映射
//Stream<Integer> stream1 = stream.map(str -> Integer.parseInt(str));
//stream1.forEach(str-> System.out.println(str));
//System.out.println(stream.count());,计数
//Stream<String> stream1 = stream.limit(3);
//Stream<String> stream1 = stream.skip(2)
Stream<String> stream3 = Stream.concat(stream, stream2);
stream3.forEach(str-> Syst`em.out.println(str));
}
}
``