lambda表达式简单学习


lanmda表达式是对匿名内部类的的一种使用:
 
先定义一个接口:

public interface Java8StudyService {

void study1(String name);

}

 

如果我想要使用这个接口 可以写个实现类 然后调用实现类,但是如果我不想写实现类怎么使用这个接口呢?

我们可以使用匿名内部类的方法

Java8StudyService studyService = new Java8StudyService() {

@Override

public void study1(String name) {

System.err.println(name);

}

};

studyService.study1("李白");

 

但是有没有什么办法可以把上面的方法给简写呢?

有的---lanmda表达式:利用匿名内部类调用方法

语法规则

()- > {}

 

() : 表示入参

{ } :表示方法的实现

 

--------

Java8StudyService java8StudyService = (name)-> {

System.err.println("我是匿名");

};

java8StudyService.study1("李白");

 

缺点: 接口类中只能定义一个接口;

在接口上加上注解@FunctionalInterface 表示函数接口,如果别人再新增接口会爆红

@FunctionalInterface

public interface Java8StudyService {

void study1(String name);

}

 

------------------------

课后作业:

以往我们用匿名内部类创建一个线程如下

new Thread(new Runnable() {

@Override

public void run() {

System.err.println(123);

}

}).start();

 

Runnable 是一个接口 且这个接口上增加了@FunctionalInterface这个注解


 

那么使用lanmoda表达式如何优化上面那几行代码呢


new Thread(()->{

System.err.println(456);

}).start();

 

课后作业2

List<String> list =new ArrayList<>();

list.add("a");

list.forEach(new Consumer<String>() {

@Override

public void accept(String s) {

System.err.println(s);

}

});

Consumer 是个函数接口 如何化优化代码?

list.forEach(s->{

System.err.println(s);

});

 

常见用法

遍历:

map.forEach((k,v)->{

System.err.println(k);

});

 

作业三 排序

List<Integer> list2 =new ArrayList<>();

list2.sort(new Comparator<Integer>() {

@Override

public int compare(Integer o1, Integer o2) {

return o1 -o2;

}

});

 

如何优化:

list2.sort((o1, o2) -> o1 -o2);

 














--------------------------------------------


package
controller; import java.util.*; import java.util.stream.Collectors; import static jdk.nashorn.internal.objects.NativeArray.filter; /** * @author liuming * @since 2020/4/14 */ public class MainMethod { /** *@参数 *@返回值 lambda表达式的常见用法 *@创建人 liuming *@创建时间 2020/4/14 */ public static void main(String[] args) { System.err.println("-----------------1 遍历map" + " 2.1 遍历list" + "-------------------------------"); //涉及知识点 foreach 遍历 // stream.filter 进行过滤 // stream.map 修改变量值 System.err.println("1------------------------------------------------"); Map<String,String> aMap = new HashMap<>(); aMap.put("Aluka", "AluWife"); aMap.put("GodV", "mifengaaa"); aMap.forEach((k,v)->{ System.err.println(k); System.err.println(v); }); System.err.println("2.1 ------------------------------------------------"); //2.1 对list迭代遍历 List<String> list=new ArrayList<>(); List<String> list2=new ArrayList<>(); list.add("a"); list.add("c"); list.add("v"); list.add("b"); //相当于for循环遍历 list.forEach(n-> { //对每个变量进行打印 或者其他操作 如:加入list2 list2.add(n); }); System.err.println("2 .2------------------------------------------------"); // 2.2 使用场景 将list2中每个变量加上xxxxl 然后遍历打印出来 list2.stream().map(n->n+"xxxl").forEach(n-> System.err.println(n)); // 2.3 使用场景 将list2中每个变量加上后缀xxxxl 后将所有变量拼接成一个字符串 System.err.println("2 .3------------------------------------------------"); String pinjie=list2.stream().map(n->n+"xxl") //加后缀 .reduce((a,b)->a+b)//定义 操作相加 .get(); //获得结果 System.err.println(pinjie); System.err.println("3------------------------------------------------"); //3 list进行过滤出J开头的单词 然后返回过滤后的集合 List<String> languages = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp"); List<String> result=languages.stream().filter(language ->language.startsWith("J")) .collect(Collectors.toList()); System.err.println(result); System.err.println("4------------------------------------------------"); // 将字符串换成大写并用逗号链接起来 返回一个字符串 List<String> G7 = Arrays.asList("USA", "Japan", "France", "Germany", "Italy", "U.K.","Canada"); String G7Countries = G7.stream().map(x -> x.toUpperCase()).collect(Collectors.joining(", ")); System.out.println(G7Countries); // 5实现Runnable new Thread(()-> System.err.println("1实现Runnable")).start(); } }

 

posted @ 2020-04-14 10:43  口水青春  阅读(193)  评论(0编辑  收藏  举报