Java--Lambda
2021/9/21 14:26:52
本文主要是介绍Java--Lambda,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
什么是Lambda表达式
通过Lambda把Java从强类型语言变成弱类型语言
通过Lambda可以使代码更加简洁。
Stream:
-
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
-
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
-
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
-
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
- filter 方法用于通过设置的条件过滤出元素
例子1:做一个a+b方法
Stream 提供了新的方法 ‘forEach’ 来迭代流中的每个数据
普通写法:
public int add(int x, int y) { return x + y;//返回两数之和 }
Lambda写法:
(x, y) -> x + y; //返回两数之和
例子2:输出数组里的所有元素:
@Test public void a(){ int []a={1,2,3,4,5,6,7,8,9}; for(int i:a){ System.out.println(i); } List list= Arrays.asList(a); list .forEach(c->System.out.println(c)); }
可见λ表达式由三部分组成:参数列表,箭头(->),以及一个表达式或语句块。
下面我会用一个比较长例子来彻底理解Lambda
- 我们首先创建一个Person类,用于Lambda使用时提供所需要的方法
public class Person { private String firstName; private String lastName; private String job; private String gender; private int salary; private int age; public Person(){ } public Person(String firstName, String lastName){ this.firstName = firstName; this.lastName = lastName; } public Person(String firstName, String lastName, String job, String gender, int age, int salary) { this.firstName = firstName; this.lastName = lastName; this.gender = gender; this.age = age; this.job = job; this.salary = salary; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getJob() { return job; } public void setJob(String job) { this.job = job; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getSalary() { return salary; } public void setSalary(int salary) { this.salary = salary; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
- 其次我们创建一个名字为javaProgrammers的一个集合
public static List<Person> javaProgrammers = new ArrayList<Person>() { { add(new Person("Elsdon", "Jaycob", "Java programmer", "male", 43, 2000)); add(new Person("Tamsen", "Brittany", "Java programmer", "female", 23, 1500)); add(new Person("A", "Donny", "Java programmer", "male", 33, 1800)); add(new Person("Sindy", "Jonie", "Java programmer", "female", 32, 1600)); add(new Person("Vere", "Hervey", "Java programmer", "male", 22, 1200)); add(new Person("Maude", "Jaimie", "Java programmer", "female", 27, 1900)); add(new Person("Shawn", "Randall", "Java programmer", "male", 30, 2300)); add(new Person("Jayden", "Corrina", "Java programmer", "female", 35, 1700)); add(new Person("B", "Dene", "Java programmer", "male", 33, 1200)); add(new Person("Addison", "Pam", "Java programmer", "female", 34, 1300)); }
- 我们的第一个操作为给所有程序员涨薪为原来的1.5倍
@Test public void ok() { Consumer<Person> t = e -> e.setSalary(e.getSalary() / 100 * 150); javaProgrammers.forEach(t); javaProgrammers.forEach(a -> System.out.println(a.getFirstName() + " " + a.getSalary())); }
- 接下来我们将进行练习“与”,“或”
- 在数据中找到年龄>30岁的女性
- 在数据中找到年龄>30岁的人和所有女性
第一种方法:
public void predicate0() { Predicate<Person> pre = p -> p.getGender().equals("female"); Predicate<Person> pre1 = p -> p.getAge() > 30; //或 javaProgrammers.stream().filter(pre.or(pre1)).forEach(c -> System.out.println(c.getFirstName())); //与 javaProgrammers.stream().filter(pre).filter(pre1).forEach(c -> System.out.println(c.getFirstName())); }
第二种方法:
@Test public void predicate() { Predicate<Person> pre = p -> p.getGender().equals("female") && p.getAge() > 30; Predicate<Person> pre1 = p -> p.getGender().equals("female") || p.getAge() > 30; javaProgrammers.stream().filter(pre).forEach(a -> System.out.println(a.getFirstName())); javaProgrammers.stream().filter(pre1).forEach(a -> System.out.println(a.getFirstName())); }
- 下面我将演示limit的用法
limit 方法用于获取指定数量的流。
例子:输出性别为male的默认排序排在前三的人的全名
@Test public void ok1() { javaProgrammers.stream().filter(p -> p.getGender().equals("male")).limit(3).forEach(p -> System.out.printf("%s %s\n", p.getFirstName(), p.getLastName())); }
- 接下来我将介绍三个关键字nonNull(不是空)isNull,isEmpty他们两个一个是null一个是空
@Test public void ok() { String s = null; Predicate<String> p = Objects::nonNull; System.out.println(p.test(s)); Predicate<String> p1 = Objects::isNull; System.out.println(p1.test(s)); String s2 = ""; Predicate<String> p2 = String::isEmpty; System.out.println(p2.test(s2)); }
- 接下来我将演示通过Lambda进行比较
@Test public void ok2() { Comparator<String> c = (p1, p2) -> p1.length() - p2.length();//比较的是字符串的长度 System.out.println(c.compare("aaa", "bbbb")); Comparator<String> c1 = (p1, p2) -> p1.compareTo(p2);//比较的是第一个不同字母的ASCII值 System.out.println(c1.reversed().compare("aaa", "Abbb"));//reversed是反过来 }
- 接下来我将演示排序
sorted 方法用于对流进行排序
首先通过年龄进行比较,年龄相同时比较薪资
@Test public void ok4() { javaProgrammers.stream().sorted((p1, p2) -> p1.getAge() - p2.getAge() == 0 ? p1.getSalary() - p2.getSalary() : p1.getAge() - p2.getAge()).forEach(p -> System.out.println(p.getFirstName())); }
- 接下来我将演示映射
map 方法用于映射每个元素到对应的结果
- 在某个字符串前附加上一个字符串
@Test public void ok6() { String[] a = {"哈工大", "清华", "西北工业大学"}; Function<String, String> f = c -> c + "第一";//map:映射 Arrays.asList(a).stream().map(f).collect(Collectors.toList()).forEach(System.out::println);//collect(Collectors.toList()):汇总。多线程更安全 System.out.println(javaProgrammers.stream().map(p->p.getFirstName()+"lala").collect(Collectors.joining("--")));//collect(Collectors.joining("--")):用--将数据分隔开 }
- 对数组的数进行修修改
@Test public void ok8(){ List <Integer> a=Arrays.asList(100,200,300,400); a.stream().map(t->t*1.5).collect(Collectors.toList()).forEach(System.out::println);//通过映射给每个数扩大1.5倍 System.out.println(a.stream().map(t->t*1.5).reduce((t,sum)->sum+=t).get());//汇总 }
- 接下来我将演示对字符串的匹配
首先我将进行创建一个方法供调用
public List<String> stringCollection = new ArrayList<String>() { { add("aadde"); add("aaa"); add("aabbb"); } };
1字符串的匹配
@Test public void ok9(){ System.out.println(stringCollection.stream().anyMatch(s->s.startsWith("aaa")));//部分匹配 startsWith:前缀 System.out.println(stringCollection.stream().allMatch(s->s.startsWith("aaa")));//全部匹配 System.out.println(stringCollection.stream().noneMatch(s->s.endsWith("aaaaa")));//全不匹配 endsWith:后缀 }
- 显示有多少个male的两种方式
@Test public void ok10(){ System.out.println(javaProgrammers.stream().filter(c->c.getGender().equals("male")).collect(Collectors.toList()).size()); System.out.println(javaProgrammers.stream().filter(p->p.getGender().equals("male")).count()); }
- 多线程处理
parallelStream() − 为集合创建并行流。
@Test public void ok11(){ List <Integer> numbers=Arrays.asList(1,2,3,4,5,6,7,8,9); numbers.parallelStream().forEach(System.out::println);//parallel:平行的。 parallelStream()是一个并行执行的流,通过默认的ForkJoinPool提高多线程任务的速度。 //Stream具有平行处理的能力,处理的过程会分而治之,也就是将一个大任务切分成多个小任务每个任务都是一个操作 numbers.parallelStream().forEachOrdered(System.out::println);//在池子中的多个线程中只用其中的一个线程,极大的浪费了资源 System.out.println("------------------------------"); numbers.stream().forEach(System.out::println); }
- 五个计算过程中常用的方法
@Test public void ok12(){ List <Integer> numbers=Arrays.asList(1,2,3,4,5,6,7,8,9); IntSummaryStatistics is=numbers.parallelStream().mapToInt(x->x).summaryStatistics(); System.out.printf("MAX:%d---MIN:%d---AVG:%.2f----COUNT:%d---SUM:%d",is.getMax(),is.getMin(),is.getAverage(),is.getCount(),is.getSum()); }
这篇关于Java--Lambda的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-28知识管理革命:文档软件的新玩法了解一下!
- 2024-11-28低代码应用课程:新手入门全攻略
- 2024-11-28哪些办公软件适合团队协作,且能够清晰记录每个阶段的工作进展?
- 2024-11-28全栈低代码开发课程:零基础入门到初级实战
- 2024-11-28拖动排序课程:轻松掌握课程拖动排序功能
- 2024-11-28如何高效管理数字化转型项目
- 2024-11-28SMART法则好用吗?有哪些项目管理工具辅助实现?
- 2024-11-28深度剖析:6 款办公软件如何构建设计团队项目可视化管理新生态?
- 2024-11-28HTTP缓存课程:新手入门指南
- 2024-11-28实战丨证券 HTAP 混合业务场景的难点问题应对