1.Java8 新特性介绍
原文链接 https://my.oschina.net/chenxiaobian/blog/704421,https://www.cnblogs.com/hmdrzql/p/6354010.html
https://blog.csdn.net/qq_22899021/article/details/94019297
现在我们有一个需求:给一个user组成的list 按照user的年龄排序。实现不难,代码如下:
UserCompare是一个实现了Comprator的类
这种方法由于sort方法的第二个参数是Comparator 所以你要写一个实现类(我这里是UserCompare类),并且override该接口的实现方法。
java8提供了lambda来简化,有了lambda程序员从此不加班呀~
刚才那个Comparator的实现类以及内部若干代码就都省了,代之以lambda表达式。
另外,IntelliJ会提示你改成更好的写法
实现类里有多少代码,你就省了多少行代码。
高兴了半天,到底是什么原理呢?其实是java8新提供的语法糖。
我们打开java1.8 Comparator的定义,发现了类定义上面多了一个@FunctionalInterface
对,1.8多了一个概念就是FunctionalInterface,这个Comparator就是一个FunctionalInterface
有了这个注解,原来使用实现类的地方就可以代之以lambda表达式。
写java的同学对java8肯定知道 那么java8到底有哪些特性呢,总结如下:
-
Lambda表达式
-
-
函数式接口
-
-
Stream
-
-
Optional
-
-
Predicate
-
-
Function
-
-
Consumer
-
-
Filter
-
-
Map-Reduce
-
-
新的Date API
最核心的当然是函数式编程了,写代码非常简单,请看下面详细例子介绍
2.Java8 lambda使用总结-结合实例介绍
很多同学一开始接触Java8可能对Java8 Lambda表达式有点陌生,下面我将结合实例介绍Java8的使用 并与Java7进行比较:
基础类
-
-
-
-
-
public class Person {
-
-
private int id;
-
private String name;
-
private String address;
-
-
-
}
1.List操作
-
public class ExampleList {
-
private static List<String> items = new ArrayList<>();
-
-
static {
-
items.add("A");
-
items.add("BC");
-
items.add("C");
-
items.add("BD");
-
items.add("E");
-
}
-
-
public static void main(String[] args) {
-
//Java8之前操作List
-
for(String item:items){
-
System.out.println(item);
-
}
-
-
//Java8 lambda遍历list
-
items.forEach(c-> System.out.println(c));
-
-
items.forEach(item->{
-
if("C".equals(item)){
-
System.out.println(item);
-
}
-
});
-
-
System.out.println("--------");
-
-
//先过滤
-
items.stream().filter(s->s.contains("B")).forEach(c1-> System.out.println(c1));
-
-
}
-
}
2.Map操作
-
public class ExampleMap {
-
-
private static Map<String, Integer> items = new HashMap<>();
-
-
static {
-
items.put("A", 10);
-
items.put("B", 20);
-
items.put("C", 30);
-
items.put("D", 40);
-
items.put("E", 50);
-
items.put("F", 60);
-
}
-
-
public static void main(String[] args) {
-
-
//Java8之前遍历是这样遍历map
-
for(Map.Entry<String,Integer> entry:items.entrySet()){
-
System.out.println("key:" + entry.getKey() + " value:" + entry.getValue());
-
}
-
-
//Java8遍历map
-
items.forEach((key,value)-> System.out.println("key:" + key + " value:" + value));
-
-
-
}
-
-
-
}
3.Groupingby操作
-
/**
-
*
-
*Java8 Collectors.groupingBy and Collectors.mapping example
-
*/
-
public class ExampleMapping {
-
-
private static List<Person> personList = Lists.newArrayList();
-
-
static {
-
personList.add(Person.builder().id(10).address("apple").address("shanghai").build());
-
personList.add(Person.builder().id(12).address("apple").address("wuhan").build());
-
personList.add(Person.builder().id(16).address("apple").address("nanjing").build());
-
}
-
-
public static void main(String[] args) {
-
//分组
-
Map<String, List<Person>> collect = personList.stream().collect(Collectors.groupingBy(c -> c.getAddress()));
-
System.out.println(collect);
-
}
-
}
4.List转换为Map
-
public class ExampleListConvertMap {
-
-
private static List<Person> personList = Lists.newArrayList();
-
-
static{
-
personList.add(Person.builder().id(20).name("zhangsan").address("shanghai").build());
-
personList.add(Person.builder().id(30).name("lisi").address("nanjing").build());
-
}
-
-
public static void main(String[] args) {
-
//Java8 List转换Map
-
Map<Integer,Person> map_ = personList.stream().collect(Collectors.toMap((key->key.getId()),(value->value)));
-
map_.forEach((key,value)-> System.out.println(key + ":" + value));
-
-
Map<Integer, Person> mappedMovies = personList.stream().collect(
-
Collectors.toMap(Person::getRank, Person::getData));
-
-
}
-
}
5.FilterMap操作
-
public class ExampleFilterMap {
-
-
private static Map<Integer,String> map_ = Maps.newHashMap();
-
-
static{
-
map_.put(1, "linode.com");
-
map_.put(2, "heroku.com");
-
map_.put(3, "digitalocean.com");
-
map_.put(4, "aws.amazon.com");
-
}
-
-
public static void main(String[] args) {
-
//before java iterator map
-
String result = null;
-
for(Map.Entry<Integer,String> entry:map_.entrySet()){
-
if("heroku.com".equals(entry.getValue())){
-
result = entry.getValue();
-
}
-
}
-
-
System.out.println("Before Java 8 :" + result);
-
-
//Java8 Map->Stream->Filter->String
-
result = map_.entrySet().stream().
-
filter(map->"heroku.com".equals(map.getValue()))
-
.map(map->map.getValue())
-
.collect(Collectors.joining());
-
System.out.println("Java 8 :" + result);
-
-
Map<Integer,String> collect = map_.entrySet().stream()
-
.filter(c->c.getKey()==2)
-
.collect(Collectors.toMap(p->p.getKey(),p->p.getValue()));
-
System.out.println(collect);
-
-
}
-
}
6.Optional操作可以防止NullPointException
-
Optional<String> optional = Optional.of("hello");
-
System.out.println(optional.isPresent());//true
-
System.out.println(optional.get());//hello
-
System.out.println(optional.orElse("false"));
-
optional.ifPresent((s)-> System.out.println(s.charAt(0)));//h
7.给出一个详细的例子
-
@Data
-
@Builder
-
@AllArgsConstructor
-
@NoArgsConstructor
-
public class Employee {
-
-
private String name;
-
private int salary;
-
private String office;
-
}
-
-
-
public class ExampleEmployee {
-
-
private static List<Employee> employeeList = Lists.newArrayList();
-
-
static{
-
employeeList.add(Employee.builder().name("Matt").salary(5000).office("New York").build());
-
employeeList.add(Employee.builder().name("Steve").salary(6000).office("London").build());
-
employeeList.add(Employee.builder().name("Carrie").salary(20000).office("New York").build());
-
employeeList.add(Employee.builder().name("Peter").salary(7000).office("New York").build());
-
employeeList.add(Employee.builder().name("Pat").salary(8000).office("London").build());
-
employeeList.add(Employee.builder().name("Tammy").salary(29000).office("Shanghai").build());
-
}
-
-
public static void main(String[] args) {
-
//anyMatch
-
boolean isMatch = employeeList.stream().anyMatch(employee -> employee.getOffice().equals("London"));
-
System.out.println(isMatch);
-
-
//返回所有salary大于6000
-
boolean matched = employeeList.stream().allMatch(employee -> employee.getSalary()>4000);
-
System.out.println(matched);
-
-
//找出工资最高
-
Optional<Employee> hightestSalary = employeeList.stream().max((e1,e2)->Integer.compare(e1.getSalary(),e2.getSalary()));
-
System.out.println(hightestSalary);
-
-
//返回姓名列表
-
List<String> names = employeeList.stream().map(employee -> employee.getName()).collect(Collectors.toList());
-
System.out.println(names);
-
-
//List转换成Map
-
Map<String,Employee> employeeMap = employeeList.stream().collect(Collectors.toMap((key->key.getName()),(value->value)));
-
employeeMap.forEach((key,value)-> System.out.println(key + "=" + value));
-
-
//统计办公室是New York的个数
-
long officeCount = employeeList.stream().filter(employee -> employee.getOffice().equals("Shanghai")).count();
-
System.out.println(officeCount);
-
-
//List转换为Set
-
Set<String> officeSet = employeeList.stream().map(employee -> employee.getOffice()).distinct().collect(Collectors.toSet());
-
System.out.println(officeSet);
-
-
//查找办公室地点是New York的员工
-
Optional<Employee> allMatchedEmployees = employeeList.stream().filter(employee -> employee.getOffice().equals("New York")).findAny();
-
System.out.println(allMatchedEmployees);
-
-
//按照工资的降序来列出员工信息
-
List<Employee> sortEmployeeList = employeeList.stream().sorted((e1,e2)->Integer.compare(e2.getSalary(),e1.getSalary())).collect(Collectors.toList());
-
//按照名字的升序列出员工信息
-
List<Employee> sortEmployeeByName = employeeList.stream().sorted((e1,e2)->e1.getName().compareTo(e2.getName())).collect(Collectors.toList());
-
System.out.println(sortEmployeeList);
-
System.out.println("按照名字的升序列出员工信息:" + sortEmployeeByName);
-
-
//获取工资最高的前2条员工信息
-
List<Employee> top2EmployeeList= employeeList.stream()
-
.sorted((e1,e2)->Integer.compare(e2.getSalary(),e1.getSalary()))
-
.limit(2)
-
.collect(Collectors.toList());
-
System.out.println(top2EmployeeList);
-
-
//获取平均工资
-
OptionalDouble averageSalary = employeeList.stream().mapToInt(employee->employee.getSalary()).average();
-
System.out.println("平均工资:" + averageSalary);
-
-
//查找New York
-
OptionalDouble averageSalaryByOffice = employeeList.stream().filter(employee -> employee.getOffice()
-
.equals("New York"))
-
.mapToInt(employee->employee.getSalary())
-
.average();
-
System.out.println("New York办公室平均工资:" + averageSalaryByOffice);
-
-
}
-
}
8.Java8常见操作
-
-
public class EmployeeTest {
-
-
public static List<Employee> generateData() {
-
return Arrays.asList(new Employee("Matt", 5000, "New York"),
-
new Employee("Steve", 6000, "London"),
-
new Employee("Carrie", 10000, "New York"),
-
new Employee("Peter", 7000, "New York"),
-
new Employee("Alec", 6000, "London"),
-
new Employee("Sarah", 8000, "London"),
-
new Employee("Rebecca", 4000, "New York"),
-
new Employee("Pat", 20000, "New York"),
-
new Employee("Tammy", 9000, "New York"),
-
new Employee("Fred", 15000, "Tokyo"));
-
}
-
-
public static Map<String, Integer> generateMapData() {
-
Map<String, Integer> items = Maps.newHashMap();
-
items.put("A", 10);
-
items.put("B", 20);
-
items.put("C", 30);
-
items.put("D", 40);
-
items.put("E", 50);
-
items.put("F", 60);
-
-
return items;
-
}
-
-
-
@Test
-
public void testEmployee() {
-
List<Employee> results = generateData();
-
-
//打印出名字是Steve的员工信息
-
results.forEach(c -> {
-
if (c.getName().equals("Steve")) {
-
System.out.println(c);
-
}
-
});
-
-
System.out.println("---------");
-
-
//找出年薪超过6000的员工
-
results.stream().filter(c -> c.getSalary() >= 60000).forEach(c -> System.out.println(c));
-
-
System.out.println("--->>>>>>----");
-
-
//java8遍历map
-
Map<String, Integer> map_ = generateMapData();
-
map_.forEach((key, value) -> System.out.println("key:" + key + "," + "value:" + value));
-
-
System.out.println("---->>>>分组>>>-----");
-
-
//java8 分组操作
-
Map<String, List<Employee>> groupMap = results.stream().collect(Collectors.groupingBy(c -> c.getOffice()));
-
System.out.println(groupMap);
-
-
System.out.println("---->>>>List转化为Map>>>----");
-
//List转化Map
-
Map<String, Object> map = results.stream().collect(Collectors.toMap(Employee::getName, Employee::getOffice));
-
map.forEach((key, value) -> System.out.println("key:" + key + "," + "value:" + value));
-
-
System.out.println("---->>>>>>>----");
-
Map<Integer, Employee> employeeMap = results.stream().collect(Collectors.toMap((key -> key.getSalary()), (value -> value)));
-
employeeMap.forEach((key, value) -> System.out.println(key + "," + value));
-
-
System.out.println("---->>遍历map>>>----");
-
//打印出值大于30的map
-
Map<String, Integer> resultMap = map_.entrySet().stream().filter(c -> c.getValue() > 30).collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));
-
resultMap.forEach((key, value) -> System.out.println(key + "=" + value));
-
-
System.out.println(">>>>>>>>>>>>>>>");
-
//打印key=D的map
-
Map<String, Integer> mapResults = map_.entrySet().stream().filter(c -> c.getKey().equals("D")).collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));
-
mapResults.forEach((key, value) -> System.out.println(key + ">>>>" + value));
-
-
System.out.println(">>>>>>>Optional>>>>>>>");
-
Optional<String> optional = Optional.of("hello");
-
System.out.println(optional.isPresent());
-
-
}
-
-
@Test
-
public void testEmployeeExample() {
-
//anyMatch
-
List<Employee> employeeList = generateData();
-
boolean isMatch = employeeList.stream().anyMatch(employee -> employee.getOffice().equals("London"));
-
System.out.println(isMatch);
-
-
//allMatch
-
boolean matched = employeeList.stream().allMatch(employee -> employee.getOffice().equals("London"));
-
System.out.println(matched);
-
-
//找出工资最高的
-
Optional<Employee> employeeOptional = employeeList.stream().max((e1,e2)->Integer.compare(e1.getSalary(),e2.getSalary()));
-
System.out.println(employeeOptional);
-
-
//找出工资最少的
-
Optional<Employee> employee = employeeList.stream().min((e1,e2)->Integer.compare(e1.getSalary(),e2.getSalary()));
-
System.out.println(employee);
-
-
//返回姓名列表
-
List<String> names = employeeList.stream().map(c->c.getName()).collect(Collectors.toList());
-
System.out.println(names);
-
-
System.out.println(">>>>>>>>>>>");
-
//List转化Map
-
Map<String,Employee> employeeMap = employeeList.stream().collect(Collectors.toMap((key->key.getName()),(value->value)));
-
employeeMap.forEach((key,value)-> System.out.println(key + "=" + value));
-
-
//统计办公室是New York的个数
-
long officeCount = employeeList.stream().filter(c->c.getOffice().equals("New York")).count();
-
System.out.println(officeCount);
-
-
long salaryCount = employeeList.stream().filter(c->c.getSalary()>60000).count();
-
System.out.println(salaryCount);
-
-
//List转化为Set
-
Set<String> officeSet = employeeList.stream().map(c->c.getOffice()).distinct().collect(Collectors.toSet());
-
System.out.println(officeSet);
-
-
Set<Integer> salarySet = employeeList.stream().map(c->c.getSalary()).distinct().collect(Collectors.toSet());
-
System.out.println(salarySet);
-
-
//查找办公室地点是New York的员工
-
Optional<Employee> optionals = employeeList.stream().filter(c->c.getOffice().equals("New York")).findAny();
-
System.out.println(optionals);
-
-
System.out.println(">>>>>工资降序排序>>>>>");
-
//按照工资的降序来列出员工信息
-
List<Employee> sortSalaryEmployeeList = employeeList.stream().sorted((e1,e2)->Integer.compare(e2.getSalary(),e1.getSalary())).collect(Collectors.toList());
-
System.out.println(sortSalaryEmployeeList);
-
-
System.out.println(">>>>>姓名升序排序>>>>>");
-
List<Employee> sortNameEmployeeList = employeeList.stream().sorted((e1,e2)->e1.getName().compareTo(e2.getName())).collect(Collectors.toList());
-
System.out.println(sortNameEmployeeList);
-
-
System.out.println(">>>>获取工资最高的前2条员工信息");
-
List<Employee> dispaly2EmployeeList = employeeList.stream().sorted((e1,e2)->Integer.compare(e2.getSalary(),e1.getSalary())).limit(2).collect(Collectors.toList());
-
System.out.println(dispaly2EmployeeList);
-
-
System.out.println(">>>>获取平均工资");
-
OptionalDouble averageSalary = employeeList.stream().mapToInt(c->c.getSalary()).average();
-
System.out.println(averageSalary);
-
-
System.out.println(">>>>获取工作地点的平均工资");
-
OptionalDouble optionalDouble = employeeList.stream().filter(c->c.getOffice().equals("New York")).mapToInt(c->c.getSalary()).average();
-
System.out.println(optionalDouble);
-
-
System.out.println(">>>>>>Java8 Optional用法>>>>>>");
-
Optional<String> stringOptional = Optional.of("test");
-
System.out.println(stringOptional.get());
-
-
Optional<String> isOptional = Optional.ofNullable("hello");
-
System.out.println(isOptional.isPresent());
-
System.out.println(isOptional.get());
-
System.out.println(isOptional.orElse("0"));
-
-
System.out.println(">>>>>>>>>>>>");
-
//Optional<String> optionalVal = Optional.of(null);
-
// System.out.println(optionalVal);
-
Optional<String> optional = Optional.ofNullable("optional");
-
System.out.println(optional);
-
System.out.println(optional.isPresent());
-
System.out.println(optional.get());
-
System.out.println(optional.orElse("haha"));
-
System.out.println(">>>>>>>>>>>>");
-
-
Optional<Employee> employeeOptional_ = employeeList.stream().filter(c->c.getOffice().equals("New York")).findFirst();
-
System.out.println(employeeOptional_);
-
-
}
相关推荐
Java 8 是一个重要的Java平台版本,因为它引入了许多新特性,其中最显著的就是Lambda表达式。Lambda表达式是函数式编程的关键元素,它允许我们以更简洁、更易读的方式编写代码,特别是在处理集合和并发任务时。在这...
Java 8 还引入了 Stream API,这与 Lambda 表达式结合使用时,可以进行高效且简洁的数据处理。例如,你可以用 `Arrays.asList().stream()` 创建一个流,然后用 `filter()`, `map()`, `reduce()` 等方法对数据进行...
- **函数式编程**:Java 8引入了`java.util.Function`等接口,以及`Stream API`,允许开发者使用lambda表达式进行函数式编程,如映射、过滤、聚合等操作。 4. **并行处理**:通过`java.util.concurrent.ForkJoin...
在 Java 8 之前,我们通常使用匿名内部类来实现这样的接口,而 Lambda 提供了一种更简洁的替代方式。例如,下面是一个使用匿名内部类和 Lambda 实现 `Runnable` 接口的例子: ```java Runnable r1 = new Runnable()...
Java 8是Java语言的一个重大版本更新,它引入了lambda表达式,这是Java平台的核心特性之一。Lambda表达式为Java带来了函数式编程的元素,使得开发者可以以更简洁的方式编写代码,尤其是在集合和多线程方面。本资料...
Java 8 中的 Lambda 表达式是语言的重大更新,它引入了函数式编程的概念,使得代码更加简洁、易读。Lambda 表达式的主要目的是简化处理匿名内部类的情况,尤其是当这些类只需要一个方法时。 在传统的 Java 编程中,...
Java 8引入了函数式接口的概念,这些接口只包含一个抽象方法,允许Lambda表达式的使用。Lambda表达式是一种简洁的表示匿名类的方法,它可以用于创建小型代码块,然后将其作为参数传递给方法或存储在变量中。类型推断...
Java 8 是一个重要的Java平台版本,因为它引入了Lambda表达式,这是一项革命性的功能,极大地简化了函数式编程,并增强了Java的多线程处理能力。Lambda表达式是Java 8的核心特性,它允许我们将匿名函数作为方法参数...
综上所述,本书《Functional Programming in Java - Harnessing the Power of Java 8 Lambda Expressions》旨在指导Java开发者如何掌握并有效地使用Java 8中的Lambda表达式和函数式编程概念。虽然提供的文档内容存在...
Java8的Lambda表达式是Java语言的一次重大更新,它引入了函数式编程的概念,极大地简化了处理匿名函数的方式,特别是在处理集合和并发操作时。Lambda表达式使得代码更加简洁、易读,同时也提升了程序的执行效率。在...
Java 8 中引入了几个重要的流(Stream)API,与 Lambda 表达式配合使用,可以实现高效且易于理解的集合操作。例如,我们可以使用 `Arrays.stream()` 将数组转换为流,然后通过 `filter()`, `map()`, `reduce()` 等方法...
java8 lambda表达式在集合中的使用,包含代码例子。
在描述中提到的"java 8 lambda demo"很可能包含了使用Lambda表达式的示例代码。这些示例可能涉及到以下场景: 1. **Stream API**:Lambda与Java 8的Stream API结合使用,可以进行高效的数据处理。例如,过滤、映射...
这些案例涵盖了Lambda在Java 8中的核心应用,通过实践这些例子,初学者能够更好地理解Lambda如何简化代码,提升效率,以及如何将其与其他Java 8特性结合使用。在学习过程中,建议读者动手编写并运行这些代码,以加深...
此外,Stream API是Java 8的另一大亮点,它与lambda表达式配合使用,提供了丰富的集合操作。例如,过滤和映射操作可以这样实现: ```java list.stream() .filter(s -> s.startsWith("A")) .map(String::...
在这个"Java8集合 CompletableFuture lambda表达式 新的TimeAPI 和ForkJoin Demo包"中,我们可以深入探讨以下几个关键知识点: 1. **Lambda表达式**: Lambda表达式是Java 8的一大亮点,它简化了对匿名函数的处理...
java 8 lambda Concise syntax – More succinct and clear than anonymous inner classes • Deficiencies with anonymous inner classes – Bulky, confusion re “this” and naming in general, no nonfinal var...