Java学习_20220622
2022/6/23 5:19:57
本文主要是介绍Java学习_20220622,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Java 8新特性
1. 方法引用
方法引用是Lambda表达式的一种简写形式。
若Lambda表达式方法体中只是调用一个特定的已经存在的方法,则可以使用方法引用。
常见形式:
(1)对象::实例方法
//1.对象::实例方法 Consumer<String> consumer = s -> System.out.println(s); consumer.accept("hello"); Consumer<String> consumer2 = System.out::println; consumer2.accept("world");
(2)类::静态方法
//2.类::静态方法 Comparator<Integer> comparator =(o1,o2)->Integer.compare(o1,o2); Comparator<Integer> comparator1 = Integer::compare;
(3)类::实例方法
//3.类::实例方法 Function<Employee,String> function = e ->e.getName(); Function<Employee,String> function1 = Employee::getName; System.out.println(function1.apply(new Employee("小小",2333)));
(4)类::new
//4.类::new Supplier<Employee> supplier = () ->new Employee(); Supplier<Employee> supplier1 = Employee:: new; Employee employee = supplier1.get(); System.out.println(employee);
2. Stream流
流中保存对集合或数组数据的操作。和集合类似,但集合中保存的是数据。
Stream 自己不会存储元素。不会改变源对象,会返回一个持有结果的新Stream。操作是延迟执行的,等到需要结果的时候才执行。
(1)创建Stream
public static void main(String[] args) { //(1)Collection 对象中的stream()和parallelStream()方法 ArrayList<String> arrayList = new ArrayList<>(); arrayList.add("pingguo"); arrayList.add("huawei"); arrayList.add("xiaomi"); Stream<String> stream = arrayList.stream(); //遍历 // stream.forEach(s-> System.out.println(s)); stream.forEach(System.out::println); //(2)Arrays工具类的stream方法 String[] arr = {"Java","C#","JavaScript","PHP"}; Stream<String> stream1 = Arrays.stream(arr); stream1.forEach(System.out::println); //(3)Stream接口中的of iterate、generate方法 Stream<Integer> integerStream = Stream.of(10, 20, 30, 40, 50); integerStream.forEach(System.out::println); //迭代流 Stream<Integer> iterate = Stream.iterate(0, x -> x + 2); iterate.limit(5).forEach(System.out::println); System.out.println("======="); //生成流 Stream<Integer> generate = Stream.generate(() -> new Random().nextInt(100)); generate.limit(10).forEach(System.out::println); //(4)InStream,LongStream,DoubleStream 的of,range,rangeClosed IntStream intStream = IntStream.of(100, 200, 300); intStream.forEach(System.out::println); IntStream rangeClosed = IntStream.rangeClosed(0, 50); rangeClosed.forEach(System.out::println); }
(2)中间操作
public class Employee { private String name; private double money; } public static void main(String[] args) { ArrayList<Employee> list = new ArrayList<>(); list.add(new Employee("张三",1500)); list.add(new Employee("李四",4810)); list.add(new Employee("王五",2500)); list.add(new Employee("赵六",6200)); }
filter过滤
System.out.println("====filter过滤===="); list.stream() .filter(e->e.getMoney()>2000) //filter过滤 .forEach(System.out::println); //遍历
limit限制
System.out.println("====limit限制===="); list.stream() .limit(2) //只输出两个 .forEach(System.out::println);
skip跳过
System.out.println("====skip跳过===="); list.stream() .skip(3) //跳过三个 .forEach(System.out::println);
distinct去重复
System.out.println("====distinct去重复===="); list.stream() .distinct() //需要在Employee类中重写hashcode和equals方法 .forEach(System.out::println);
sorted排序
System.out.println("====sorted排序===="); list.stream() .sorted((e1,e2)->Double.compare(e1.getMoney(),e2.getMoney())) .forEach(System.out::println);
map获取name
System.out.println("====map===="); list.stream() .map(e->e.getName()) .forEach(System.out::println);
parallel 并行流,采用多线程,效率高
System.out.println("====parallel===="); list.parallelStream() .forEach(System.out::println);
(3)终止操作
forEach
min、max、count
System.out.println("====min===="); Optional<Employee> min = list.stream() .min((e1,e2)->Double.compare(e1.getMoney(),e2.getMoney())); System.out.println(min.get()); System.out.println("====max===="); Optional<Employee> max = list.stream() .max((e1,e2)->Double.compare(e1.getMoney(),e2.getMoney())); System.out.println(max.get()); System.out.println("====count===="); long count = list.stream().count(); System.out.println("员工个数"+count);
终止操作reduce
//终止操作reduce规约 //计算所有员工的工资和 System.out.println("====reduce===="); Optional<Double> sum = list.stream() .map(e -> e.getMoney()) .reduce((x, y) -> x + y); System.out.println(sum.get());
终止操作collect收集
//终止操作Collect收集 //获取所有的员工姓名,封装成一个list集合 System.out.println("====Collect===="); List<String> names = list.stream() .map(e -> e.getName()) .collect(Collectors.toList()); for(String string : names){ System.out.println(string); }
3. 日期和时间
旧版本问题:
(1)设计不合理,在java.util和java.sql的包中都有日期类,java.util.Date同时包含日期和时间的,而java.sql.Date仅仅包含日期,此外用于格式化和解析的类在java.text包下;
(2)非线程安全,java.sql.Date是非线程安全的,所有的日期类都是可变的,这是java日期类最大的问题之一;
(2)时区处理玛法,日期类并不提供国际化,没有时区支持。
日期时间的常见操作:
LocalDate、LocalTime、LocalDateTime
(1)创建指定的日期:LocalDate.of()
(2)获取当前日期:LocalDate.now()
(3)获取对应的日期信息:now.getYear(),now.getDayOfMouth(),now.getDayOfWeek().getValue()....
(4)创建指定的时间: LocalTime.of()
(5)获取当前时间:LocalTime.now()
(6)获取对应的时间信息:now.getHour(),now.getMinute(),now.getSecond()....
(7)创建指定的日期和时间:LocalDateTime.of()
(8)获取当前日期和时间:LocalDateTime.now()
(9)获取对应的日期时间信息:now.getYear(),now.getDayOfMouth(),now.getDayOfWeek().getValue(),now.getHour(),now.getMinute(),now.getSecond()....
日期和时间的修改:
对日期时间的修改,对已存在的LocalDate对象,创建了它的模板,不会修改原来的信息,而是修改副本信息。在多线程场景下是数据安全的。
LocalDateTime now = LocalDateTime.now(); LocalDateTime dateyear = now.withYear(1998); System.out.println(now);//2022-06-22T21:51:07.026831200 System.out.println(dateyear);//1998-06-22T21:51:07.026831200
在当前日期和时间的基础上,加上或者减去指定的时间
System.out.println(now.plusDays(2));//两天后2022-06-24T21:55:45.627245600 System.out.println(now.minusYears(10));//十年前2012-06-22T21:55:45.627245600
日期时间的比较
LocalDate now1 = LocalDate.now(); LocalDate of = LocalDate.of(2020, 1, 20); System.out.println(now1.isAfter(of));//now1的时间在of的时间之后 true System.out.println(now1.isBefore(of));//now1的时间在of的时间之前 false System.out.println(now1.equals(of)); //两个时间是否相等 false
格式化和解析操作
格式化操作:
LocalDateTime now2 = LocalDateTime.now(); //指定格式 使用系统默认的格式2022-06-22T22:09:23.0564635 DateTimeFormatter isoLocalDateTime = DateTimeFormatter.ISO_LOCAL_DATE_TIME; //将日期时间转换为字符串 String format = now2.format(isoLocalDateTime); System.out.println(format); //通过ofPattern方法指定特定的格式 DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String format1 = now.format(dateTimeFormatter); System.out.println(format1);//2022-06-173 22:06:85
解析
//将字符串解析为一个时间类型 LocalDateTime parse = LocalDateTime.parse("1997-05-06 22:15:18", dateTimeFormatter); System.out.println("parse = " + parse);//parse = 1997-05-06T22:15:18
这篇关于Java学习_20220622的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26Mybatis官方生成器资料详解与应用教程
- 2024-11-26Mybatis一级缓存资料详解与实战教程
- 2024-11-26Mybatis一级缓存资料详解:新手快速入门
- 2024-11-26SpringBoot3+JDK17搭建后端资料详尽教程
- 2024-11-26Springboot单体架构搭建资料:新手入门教程
- 2024-11-26Springboot单体架构搭建资料详解与实战教程
- 2024-11-26Springboot框架资料:新手入门教程
- 2024-11-26Springboot企业级开发资料入门教程
- 2024-11-26SpringBoot企业级开发资料详解与实战教程
- 2024-11-26Springboot微服务资料:新手入门全攻略