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(); } }