0
点赞
收藏
分享

微信扫一扫

lambda表达式、Stream流

1.函数式接口

JDK1.8版本以上有效

  • @FunctionalInterface语法要求当前接口只有一个尚未完成的省缺属性为public abstract修饰方法。
  • 函数式接口里允许定义默认方法和静态方法
  • 函数式接口一般用于方法增强,直接作为方法的参数,实现插件式编程。

格式

@FunctionalInterface interface test{ void test(); }

用途

lambda表达式和方法引用

2.lambda表达式

基本格式

(联想参数变量) -> {执行任务代码块}

lambda表达式关注的是接口中的方法的返回值和参数。方法名不重要

2.1无参数无返回值

设计接口

函数式接口,当作下面方法的参数

@FunctionalInterface interface A{ void 方法名(); }

设计方法

将上面的接口当作参数

public static void testLambda(A a){ a.方法名; }

代码实现

/* 匿名内部类方式 */ testLambda(new A(){ @Override public void 方法名(){ System,out.println("匿名内部类对象方法实现"); } }); /* lambda表达式实现 */ testLambda(() -> { System.out.println("lambda表达式"); }) /* lambda表达式优化 */ testLambda(() -> System.out.println("lambda表达式优化")); /* 方法引用 */ testLambda(当前类的类名::test); /*方法引用调用的方法*/ public static void test(){ System.out.println("方法引用"); }

2.2 无参数有返回值

生产者接口

设计接口

@FunctionalInterface interface Supplier<T>{ T get(); }

设计方法

/** *返回一个字符串数据内容 * *@params s 生产者 *@return */ public static String testLambda(Supp;ier<String> s){ return s.get(); }

代码实现

/* 匿名内部类形式 */ String s = testLambda(new Supplier<String>){ @Override public String get(){ return "一个字符串"; } }); System.out.println(s); /* lambda表达式 */ String s1 = testlambda(() -> { return "也是一个字符串“; }) Sysout.out.println(s1); /* lambda优化 */ String s2 = testLambda(() -> "还是一个字符串"); System.out.println(s2); /* lambda使用方法局部变量 */ String str = "依旧&还是一个字符串"; String s3 = testLambda((str) ->{ Sttring[] split = str.split(&); return split[0]; }) System.out.prinln(s3); /* 方法引用 */ String s4 = testLambda(目标方法所处类的类名::方法名); System.out.println(s4); //方法引用所使用的方法 public static String 方法名{ return "被引用的方法"; }

2.3有参数无返回值

消费者接口

接口设计

@Functionalface public interface Consumer<T>{ void accept(T t); }

方法设计

consumer可以传入实现类对象和lambda表达式

public static void testLambda(String str , Consumer<String> handle){ //需要方法外部针对传入的字符串参数有处理能力 //通过Consumer接口传入 handle.accept(str); }/* 匿名内部类方式 */ testLambda("字符串",Consumer<String>(){ @Override public void accept(String t){ System.out.println(t); } }); /* lambda表达式 */ testLambda("一个字符串",(s) ->{ System.out.println(Arrays.toString(s.toCharArray()))); }); /* lambda优化 */ testLambda("一个字符串",s -> System.out.println(Arrays.toString(s.toCharArray()))); //方法引用 testLambda("还是一个字符串",System.out::println); testLambda("依旧是一个字符串",方法所属类的类名::方法名); /* 被引用的方法 */ public static void test(Stirng str){ System.out.println(str); }

2.4有参数有返回值

比较器接口

接口设计

@Functionalinterface interface Comparator<T>{ int compare(T o1,T o2); }

比较器案例

/*生成数据*/ Person[] array = new Person[5]; for(int i = 0; i < array.length;i++){ int age = (int) Math.random() * 50; array[i] = new new Person(i + 1, "张三" + i, age,false); } /* lambda表达式 */ Preson[] temp = filterPredicate(array,p -> p.getAge() > 10); for(Person person : temp){ System.out.println(person); } /** *利用predicate过滤器接口限制数组内容 *@param array Person *@param filter Predicate @return temp 过滤后的心数组 */ public static Person[] filterPredicate(Person[] array,Predicate<Person> filter){ Person[] temp = new Person[array.length]; int count = 0; for(int i = 0; i < array.length;i++){ //判断当前Person对象是否满足要求,如果满足,存储到temp中 if(filter.test(array[i])){ temp[count++] = array[i]; } } return temp; }

过滤器接口

接口设计

@FunctionalInterface interface Predicate<T>{ boolean test(T t); }

类型转换接口

接口设计

@FunctionalInterface interface Function<T, R>{ R apply(T,t); }

代码实现

String str = "坠落吧,落吧,想你的雪花放肆在心里落下"; int i = testLambda(str,s -> s.length()); System.out.println(i); public static int testLambda(String str,Function<String,Integer> fun){ return fun.apply(str); }

3.stream流

利用流水线思想怼集合,数组数据就行处理和操作。

例如;排序,筛选,类型转换

案例

ArrayList<String> list = new ArrayList<>();
/**添加数据**/

//处理数据
list.stream()//stream流
.skip(2)//跳过两个元素
.limit(8)//保留八个元素
.filter(s -> s.length() > 4)//过滤长度大于4的元素
.sorted(Comparator.comparing(String::length))//指定排序规则,按照长度排序
.forEach(System.out::println);//遍历输出

conllect

// Stream 流数据内容转 List 集合
List<String> list1 = list.stream().distinct().collect(Collectors.toList());
// Stream 流数据内容转 Set 集合
Set<String> set = list.stream().skip(2).limit(20).collect(Collectors.toSet());

举报

相关推荐

0 条评论