Java8新特性学习

FPGA实战:手把手教你配置4个Aurora 8B/10B IP核共享时钟(附完整工程文件) 本文详细介绍了在Xilinx FPGA上配置四个Aurora 8B/10B IP核并实现时钟共享的实战指南。从工程规划、IP核基础配置到共享逻辑的实现,再到多核时钟域与复位架构的设计,以及时序约束与调试技巧,提供了完整的解决方案和可复用的工程文件。特别强调了GT参考时钟的共享和复位信号的处理,帮助工程师高效解决多通道高速串行通信的设计挑战。 阅读详情

为啥使用Lambda表达式

Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码 像数据一样进行传递)。可以写出更简洁、更 灵活的代码。作为一种更紧凑的代码风格,使 Java的语言表达能力得到了提升。

Lambda表达式的基础语法

Java8中引入了一个新的操作符>该操作符称为箭头操作符或Lambda操作符箭头操作符将 Lambda 表达式拆分成两部分:
左侧:Lambda 表达式的参数列表
右侧:Lambda 表达式中所需执行的功能,即Lambda 体

无参无返回

语法格式一: 无参数,无返回值

() -> System.out.println("hello lambda");

有参无返回

语法格式二:有一个参数,并且无返回值

(x) -> System.out.println(x)

一个参数

语法格式三 : 若只有一个参数,小括号可以省略不写

x -> System.out.println(x)

多参

语法格式四:有两个以上的参数,并且Lambda体中有多条语句

Comparator<Integer> comparator = (x, y) -> {
    System.out.println("函数式接口");
    return Integer.compare(x, y);
};

单个语句体

语法格式五:若Lambda体中只有一条语句,return和大括号都可以省略不写

 Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);

类型推断

语法格式六:Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即"类型推断"

Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);

上联:左右遇一括号省
下联:左侧推断类型省
横批:能省则省
二、Lambda 表达式需要“函数式接口”的支持
函数式接口:接口中只有一个抽象方法的接口,称为函数式接口。可以使用注解@FunctionalInterface 修饰可以检查是否是函数式接口

package com.company;

import org.junit.Test;

import java.util.Comparator;
import java.util.function.Consumer;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2023/1/3 23:02
 * @Description Lambda基础语法
 */
public class TestLambda2 {

    /**
     * 语法格式一: 无参数,无返回值
     */
    @Test
    public void test() {
        Runnable runnable = () -> System.out.println("Hello Lambda!");
        runnable.run();
    }

    /**
     * 语法格式二:有一个参数,并且无返回值
     */
    @Test
    public void test2() {
        Consumer consumer = (x) -> System.out.println(x);
        consumer.accept("我是上柜");
    }

    /**
     * 语法格式三 : 若只有一个参数,小括号可以省略不写
     */
    @Test
    public void test3() {
        Consumer consumer = x -> System.out.println(x);
        consumer.accept("我是上柜");
    }

    /**
     * 语法格式四:有两个以上的参数,并且Lambda体中有多条语句
     */
    @Test
    public void test4() {
        Comparator<Integer> comparator = (x, y) -> {
            System.out.println("函数式接口");
            return Integer.compare(x, y);
        };
    }

    /**
     * 语法格式五:若Lambda体中只有一条语句,return和大括号都可以省略不写
     */
    @Test
    public void test5() {
        Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
    }

    /**
     * 语法格式六:Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即"类型推断"
     */
    @Test
    public void test6() {
        Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
    }
}

四大内置核心函数式接口

在这里插入图片描述

package com.company;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2023/1/3 23:38
 * @Description Java8内置的四大核心函数式接口
 * Consumer<T> :消费型接口
 *              void accept(T t);
 * Supplier<T>:供给型接口
 *              T get();
 * Function<T,R>:函数型接口
 *              R apply(T t);
 * Predicate<T>:断言型接口
 *              boolean test(T t);
 */
public class TestLambda3 {

    /**
     * Predicate<T>:断言型接口
     */
    @Test
    public void test4() {
        List<String> list= Arrays.asList("Hello","java","Lambda");
        List<String> stringList=filterStr(list,(s)->s.length()>4);
        System.out.println(stringList);
    }

    public List<String> filterStr(List<String> list, Predicate<String> predicate) {
        List<String> strList = new ArrayList<>();
        for (String str : list) {
            if (predicate.test(str)) {
                strList.add(str);
            }
        }
        return strList;
    }
    /**
     * Function<T,R>:函数型接口
     */
    @Test
    public void test3() {
        String newStr = strHandler("\t\t\t 我要吃饭了", (str) -> str.trim());
        System.out.println(newStr);
    }

    /**
     * 用于处理字符串
     *
     * @return
     */
    public String strHandler(String str, Function<String, String> function) {
        return function.apply(str);
    }

    /**
     * Supplier<T>:供给型接口
     */
    @Test
    public void test2() {
        List<Integer> list = getNumList(5, () -> (int) (Math.random() * 100));
        System.out.println(list);
    }

    public List<Integer> getNumList(int num, Supplier<Integer> sup) {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < num; i++) {
            Integer n = sup.get();
            list.add(n);
        }
        return list;
    }

    /**
     * Consumer<T> :消费型接口
     */
    @Test
    public void test1() {
        happy(10000, m -> System.out.println(m));
    }

    public void happy(double money, Consumer<Double> consumer) {
        consumer.accept(money);
    }
}



其他接口

在这里插入图片描述

方法引用与构造器引用

package com.company;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2023/2/5 16:32
 * @Description
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee implements Serializable {

    private static final long serialVersionUID = 1L;
    private String name;
}

package com.company;

import org.junit.Test;

import java.io.PrintStream;
import java.util.Comparator;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2023/2/1 22:41
 * @Description 方法引用
 * 方法引用:若Lambda 体中的内容有方法已经实现了,我们可以使用“方法引用”
 * (可以理解为方法引用是Lambda表达式的另外一种表现形式)
 * 主要有三种语法格式:
 * 对象::实例方法名
 * 类::静态方法名
 * 类::实例方法名
 * 注意:
 * ①Lambda 体中调用方法的参数列表与返回值类型,要与函数式接口中抽象方法的函数列表和返回值类型保持一致!
 * ②若Lambda 参数列表中的第一参数是实例方法的调用者,而第二个参数是实例方法的参数时,可以使用ClassName::method
 * <p>
 * 二、构造器引用:
 * <p>
 * 格式:
 * ClassName::new
 * 注意:需要调用的构造器的参数列表要与函数式接口中抽象方法的参数列表保持一致!
 * <p>
 * 三、数组引用
 * Type[]::new;
 */
public class TestMethodRef {

    /**
     * 数组引用
     */
    @Test
    public void test7() {
        Function<Integer, String[]> fun = (x) -> new String[x];
        String[] strs = fun.apply(10);
        System.out.println(strs.length);
    }

    @Test
    public void test6() {
        Function<String, Employee> function = (x) -> new Employee(x);
        // Employee只有一个有参构造器
        Function<String, Employee> fun2 = Employee::new;
        Employee employee = fun2.apply("小红");
        System.out.println(employee);
    }

    /**
     * 构造器引用
     */
    @Test
    public void test5() {
        Supplier<Employee> supplier = () -> new Employee();

        // 构造器引用方式
        Supplier<Employee> supplier2 = Employee::new;
        Employee employee = supplier2.get();
        System.out.println(employee);
    }

    /**
     * 类::实例方法名
     */
    @Test
    public void test4() {
        BiPredicate<String, String> biPredicate = (x, y) -> x.equals(y);
        BiPredicate<String, String> bp = String::equals;
    }

    /**
     * 类 :: 静态方法名
     */
    @Test
    public void test3() {
        Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
        Comparator<Integer> com = Integer::compare;
    }

    /**
     * 对象 ::实例方法名
     */
    @Test
    public void test1() {
        PrintStream ps1 = System.out;
        Consumer<String> con = (x) -> ps1.println(x);

        PrintStream ps = System.out;
        Consumer<String> con1 = ps::println;

        Consumer<String> con2 = System.out::println;
        con2.accept("acdef");
    }

    @Test
    public void test2() {
        Employee emp = new Employee();
        Supplier<String> sup = () -> emp.getName();
        String str = sup.get();
        System.out.println(str);
    }
}


Stream

简介

Java8中有两大最为重要的改变。第一个是Lambda 表达式;另外一
个则是流API(java.util.stream.*).
Stream是Java8中处理集合的关键抽象概念,它可以指定你希望对 集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。 使用Stream API 对集合数据进行操作,就类似于使用SQL执行的数
据库查询。也可以使用Stream API来并行执行操作。简而言之,
Stream API 提供了一种高效且易于使用的处理数据的方式。

什么是Stream

是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。
“集合讲的是数据,流讲的是计算!”
注意:

  • Stream自己不会存储元素。
  • Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream
  • Stream操作是延迟执行的。这意味着他们会等到需要结果的时候才执行

Stream操作步骤

创建Stream

一个数据源(如:集合、数组),获取一个流

package com.company;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

/**
 * Stream操作步骤
 * 1.创建Stream
 * 2.中间操作
 * 3.终止操作(终端操作)
 */
public class TestStreamAPI {

    // 创建Stream
    @Test
    public void test1() {
        //1.可以通过Collection 系列集合提供的stream()或parallelStream()
        List<String> list = new ArrayList<>();
        Stream<String> stream1 = list.stream();

        // 2.通过Arrays 中的静态方法stream()获取数组流
        Employee[] employee = new Employee[10];
        Stream<Employee> stream2 = Arrays.stream(employee);

        // 3.通过Stream类中的静态方法of()
        Stream<String> stream3 = Stream.of("aa", "bb", "cc", "dd", "ee");

        //4。创建无限流
        //迭代
        Stream<Integer> stream4 = Stream.iterate(0, (x) -> x + 2);
        stream4.limit(10).forEach(System.out::println);

        //生成
        Stream.generate(()->Math.random()).limit(5).forEach(System.out::println);
    }
}

中间操作

一个中间操作链,对数据源的数据进行处理
在这里插入图片描述

package com.company;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2023/2/5 16:32
 * @Description
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee implements Serializable {

    private static final long serialVersionUID = 1L;
    private String name;
    private Integer age;
    private Double salary;
}

package com.company;

import org.junit.Test;

import java.util.*;
import java.util.stream.Stream;

/**
 *
 */
public class TestStreamAPI2 {

    List<Employee> employees = Arrays.asList(
            new Employee("张三", 18, 9999.99),
            new Employee("李四", 58, 5555.55),
            new Employee("王五", 26, 3333.33),
            new Employee("赵六", 36, 6666.66),
            new Employee("田七", 12, 8888.88),
            new Employee("田七", 12, 8888.88),
            new Employee("田七", 12, 8888.88)
    );

    /**
     * 筛选与切片
     * filter—接收Lambda,从流中排除某些元素
     * limit—截断流,使其元素不超过给定数量。
     * skip(n)—跳过元素,返回一个扔掉了前n个元素的流。若流中元素不足n个,则返回一个空流。
     * 与limit(n)互补 distinct一—筛选,通过流所生成元素的hashcode()和equals()去除重复元素
     */

    //内部迭代:迭代操作由Stream API完成
    @Test
    public void test1() {
        // 中间操作:不会执行任何操作
        Stream<Employee> stream = employees.stream().filter((e) -> e.getAge() > 35);

        //终止操作:一次性抓行全部内容,即“惰性求值”
        stream.forEach(System.out::println);
    }

    /**
     * 外部迭代
     */
    @Test
    public void test2() {
        Iterator<Employee> iterator = employees.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }

    /**
     * limit 截断流
     */
    @Test
    public void test3() {
        employees.stream().filter((e) -> {
            System.out.println("短路");
            return e.getSalary() > 5000;
        }).limit(2)
                .forEach(System.out::println);
    }

    /**
     * skip 跳过
     */
    @Test
    public void test4() {
        employees.stream().filter((e) -> e.getSalary() > 5000).limit(2)
                .skip(2)
                .forEach(System.out::println);
    }

    /**
     * distinct 去重
     */
    @Test
    public void test5() {
        employees.stream().filter((e) -> e.getSalary() > 5000).limit(2)
                .distinct()
                .forEach(System.out::println);
    }

    /**
     * 映射
     * map—接收Lambda,将元素转换成其他形式或提取信息。接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
     * flatMap—接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
     */
    @Test
    public void test6() {
        List<String> list = Arrays.asList("aaa", "ccc", "ddd");
        list.stream().map((str) -> str.toUpperCase()).forEach(System.out::println);
        System.out.println("--------------------------------");
        Stream<Stream<Character>> stream = list.stream().map(TestStreamAPI2::filterCharacter);
        stream.forEach((sm) -> {
            sm.forEach(System.out::println);
        });
        System.out.println("--------------------------------");
        list.stream().flatMap(TestStreamAPI2::filterCharacter).forEach(System.out::println);
    }

    public static Stream<Character> filterCharacter(String str) {
        List<Character> list = new ArrayList<>();
        for (Character ch : str.toCharArray()) {
            list.add(ch);
        }
        return list.stream();
    }

    /**
     * sorted()—自然排序(Comparable)
     * sorted(Comparator com)—定制排序(Comparator)
     */
    @Test
    public void test7() {
        List<String> list = Arrays.asList("aaa", "ccc", "ddd");
        list.stream().sorted().forEach(System.out::println);
        System.out.println("--------------------------------");
        employees.stream().sorted((e1, e2) -> {
            if (e1.getAge().equals(e2.getAge())) {
                return e1.getName().compareTo(e2.getName());
            } else {
                return e1.getAge().compareTo(e2.getAge());
            }
        }).forEach(System.out::println);
    }
}

终止操作(终端操作)

一个终止操作,执行中间操作链,并产生结果
在这里插入图片描述

package com.company;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee implements Serializable {

    private static final long serialVersionUID = 1L;
    private String name;
    private Integer age;
    private Double salary;
    private Status status;

    public enum Status{
        FREE,
        BUSY,
        VOCATION;
    }
}

package com.company;

import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2023/2/9 23:58
 * @Description 终止操作
 */
public class TestStreamAPI3 {
    /**
     * 查找与匹配
     * allMatch—检查是否匹配所有元素
     * anyMatch一检查是否至少匹配一个元素
     * noneMatch—检查是否没有匹配所有元素
     * findFirst—返回第一个元素
     * findAny—返回当前流中的任意元素
     * count—返回流中元素的总个数
     * max—返回流中最大值
     * min—返回流中最小值
     */

    List<Employee> employees = Arrays.asList(
            new Employee("张三", 18, 9999.99, Employee.Status.FREE),
            new Employee("李四", 58, 5555.55, Employee.Status.BUSY),
            new Employee("王五", 26, 3333.33, Employee.Status.VOCATION),
            new Employee("赵六", 36, 6666.66, Employee.Status.FREE),
            new Employee("田七", 12, 8888.88, Employee.Status.BUSY)
    );

    @Test
    public void test1() {
        boolean flag = employees.stream().allMatch(e -> e.getStatus().equals(Employee.Status.BUSY));
        System.out.println("flag=" + flag);
        boolean flag1 = employees.stream().anyMatch(e -> e.getStatus().equals(Employee.Status.BUSY));
        System.out.println("flag1=" + flag1);
        boolean flag2 = employees.stream().noneMatch(e -> e.getStatus().equals(Employee.Status.BUSY));
        System.out.println("flag2=" + flag2);
        // 按工资排序取出最大的值
        Optional<Employee> optional = employees.stream().sorted((e1, e2) -> -Double.compare(e1.getSalary(), e2.getSalary()))
                .findFirst();
        System.out.println(optional.get());
        System.out.println("并行流,多个线程同时去查找");
        Optional<Employee> op2 = employees.parallelStream().filter((e) -> e.getStatus().equals(Employee.Status.FREE))
                .findAny();
        System.out.println(op2.get());
    }

    @Test
    public void test2() {
        Long count = employees.stream().count();
        System.out.println("count=" + count);
        Optional<Employee> optional = employees.stream().max((e1, e2) -> Double.compare(e1.getSalary(), e2.getSalary()));
        System.out.println("获得最大值");
        System.out.println(optional.get());
        System.out.println("最小值");
        Optional<Double> op2 = employees.stream().map(Employee::getSalary).min(Double::compare);
        System.out.println(op2.get());
    }
}

归约与收集

在这里插入图片描述

package com.company;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2023/2/5 16:32
 * @Description
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee implements Serializable {

    private static final long serialVersionUID = 1L;
    private String name;
    private Integer age;
    private Double salary;
    private Status status;

    public enum Status{
        FREE,
        BUSY,
        VOCATION;
    }
}

package com.company;

import org.junit.Test;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2023/2/15
 * @Description
 */
public class TestStreamAPI4 {

    List<Employee> employees = Arrays.asList(
            new Employee("张三", 18, 9999.99, Employee.Status.FREE),
            new Employee("李四", 58, 5555.55, Employee.Status.BUSY),
            new Employee("王五", 26, 3333.33, Employee.Status.VOCATION),
            new Employee("赵六", 36, 6666.66, Employee.Status.FREE),
            new Employee("田七", 12, 8888.88, Employee.Status.BUSY),
            new Employee("田七", 12, 8888.88, Employee.Status.BUSY)
    );

    /**
     * 归约
     * reduce(T identity,BinaryOperator)/ reduce(BinaryOperator)—可以将流中元素反复结合起来,得到一个值。
     * T identity:初始值
     * BinaryOperator:二进制操作,用于累加,相减
     */
    @Test
    public void test() {
        System.out.println("第一种方式");
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        Integer sum = list.stream().reduce(0, (x, y) -> x + y);
        System.out.println("sum=" + sum);
        System.out.println("第二种方式");
        Integer sum2 = list.stream().reduce(0, Integer::sum);
        System.out.println("sum2=" + sum2);
    }

    /**
     * 收集
     * collect—将流转换为其他形式。接收一个Collector接口的实现,用于给Stream中元素做汇总的方法
     */
    @Test
    public void test2() {
        System.out.println("--------------list类型收集--------------");
        List<String> list = employees.stream().map(Employee::getName).collect(Collectors.toList());
        list.forEach(System.out::println);
        System.out.println("--------------set类型收集--------------");
        Set<String> set = employees.stream().map(Employee::getName).collect(Collectors.toSet());
        set.forEach(System.out::println);
        System.out.println("----------------HashSet类型收集-------------");
        HashSet<String> hs = employees.stream().map(Employee::getName).collect(Collectors.toCollection(HashSet::new));
        hs.forEach(System.out::println);
    }

    @Test
    public void test3() {
        System.out.println("总数");
        Long count = employees.stream().collect(Collectors.counting());
        System.out.println(count);
        System.out.println("平均值");
        Double avg = employees.stream().collect(Collectors.averagingDouble(Employee::getSalary));
        System.out.println(avg);
        System.out.println("总和");
        Double sum = employees.stream().collect(Collectors.summingDouble(Employee::getSalary));
        System.out.println(sum);
        System.out.println("最大值");
        Optional<Employee> max = employees.stream().collect(Collectors.maxBy((e1, e2) ->
                Integer.compare(e1.getAge(), e2.getAge())
        ));
        System.out.println(max.get());
        System.out.println("最小值");
        Optional<Double> min = employees.stream().map(Employee::getSalary).collect(Collectors.minBy(Double::compareTo));
        System.out.println(min.get());
    }

    /**
     * 分组
     */
    @Test
    public void test4() {
        Map<Employee.Status, List<Employee>> map =
                employees.stream().collect(Collectors.groupingBy(Employee::getStatus));
        // jdk8遍历map
        map.forEach((k, v) -> {
            System.out.println(k);
            System.out.println(v);
            System.out.println("----------------");
        });
        /** 返回格式如下
         * BUSY
         * [Employee(name=李四, age=58, salary=5555.55, status=BUSY), Employee(name=田七, age=12, salary=8888.88, status=BUSY),
         * Employee(name=田七, age=12, salary=8888.88, status=BUSY)]
         */
    }
}

并行流与顺序流

在这里插入图片描述

Fork/Join框架

在这里插入图片描述
在这里插入图片描述

package com.company;

import java.util.concurrent.RecursiveTask;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2023/2/18
 * @Description
 */
public class ForkJoinCalculate extends RecursiveTask<Long> {

    private static final long serialVersionUID = 1L;

    /**
     * 开始
     */
    private long start;

    /**
     * 结束
     */
    private long end;
    /**
     * 临界值
     */
    private static final long THRESHOLD = 10000;

    public ForkJoinCalculate(long start, long end) {
        this.start = start;
        this.end = end;
    }

    @Override
    protected Long compute() {
        long length = end - start;
        if (length <= THRESHOLD) {
            long sum = 0;
            for (long i = start; i <= end; i++) {
                sum += i;
            }
            return sum;
        } else {
            long middle = (start + end) / 2;
            ForkJoinCalculate left = new ForkJoinCalculate(start, middle);
            // 拆分子任务,同时加入线程队列
            left.fork();
            ForkJoinCalculate right = new ForkJoinCalculate(middle + 1, end);
            right.fork();
            return left.join() + right.join();
        }
    }
}

package com.company;

import org.junit.Test;

import java.time.Duration;
import java.time.Instant;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.stream.LongStream;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2023/2/18
 * @Description
 */
public class TestForkJoin {

    /**
     * ForkJoin框架
     */
    @Test
    public void test1() {
        Instant start = Instant.now();
        ForkJoinPool pool = new ForkJoinPool();
        ForkJoinTask<Long> task = new ForkJoinCalculate(0, 100000000000L);
        Long sum = pool.invoke(task);
        System.out.println(sum);
        Instant end = Instant.now();
        // 932356074711512064
        //耗费时间:12513毫秒
        System.out.println("耗费时间:" + Duration.between(start, end).toMillis() + "毫秒");
    }

    /**
     * 普通for循环
     */
    @Test
    public void test2() {
        Instant start = Instant.now();
        long sum = 0L;
        for (long i = 0; i <= 100000000000L; i++) {
            sum += i;
        }
        System.out.println(sum);
        Instant end = Instant.now();
        //932356074711512064
        //耗费时间:26157毫秒
        System.out.println("耗费时间:" + Duration.between(start, end).toMillis() + "毫秒");
    }

    /**
     * java8并行流
     */
    @Test
    public void test3() {
        Instant start = Instant.now();
        LongStream.rangeClosed(0, 100000000000L)
                // 并行流
                .parallel()
                .reduce(0, Long::sum);
        Instant end = Instant.now();
        // 耗费时间:6971毫秒
        System.out.println("耗费时间:" + Duration.between(start, end).toMillis() + "毫秒");
    }
}

Optional类

在这里插入图片描述

package com.company;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2023/2/5 16:32
 * @Description
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee implements Serializable {

    private static final long serialVersionUID = 1L;
    private String name;
    private Integer age;
    private Double salary;
    private Status status;

    public enum Status{
        FREE,
        BUSY,
        VOCATION;
    }
}

package com.company;

import org.junit.Test;

import java.util.Optional;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2023/2/18
 * @Description
 */
public class OptionalTest {

    /**
     * 创建一个Optional实例
     */
    @Test
    public void test1() {
        Optional<Employee> op = Optional.of(new Employee());
        Employee employee = op.get();
        System.out.println(employee);
    }

    @Test
    public void test2() {
        Optional<Employee> op = Optional.empty();
        System.out.println(op.get());
    }

    @Test
    public void test3() {
        Optional<Employee> op = Optional.ofNullable(null);
        if (op.isPresent()) {
            System.out.println("判断是否包含值");
            System.out.println(op.get());
        }
        Employee employee = op.orElse(new Employee("张三", 19, 888.88, Employee.Status.BUSY));
        System.out.println(employee);
    }

    @Test
    public void test4() {
        Optional<Employee> op = Optional.ofNullable(null);
        Employee employee = op.orElseGet(() -> new Employee());
        System.out.println(employee);
    }

    @Test
    public void test5() {
        Optional<Employee> op = Optional.ofNullable(new Employee("张三", 19, 888.88, Employee.Status.BUSY));
        Optional<String> str = op.map(Employee::getName);
        System.out.println(str.get());
    }

    @Test
    public void test6() {
        Optional<Employee> op = Optional.ofNullable(new Employee("张三", 19, 888.88, Employee.Status.BUSY));
        Optional<String> str = op.flatMap((e) -> Optional.of(e.getName()));
        System.out.println(str.get());
    }
}

接口中的默认方法与静态方法

在这里插入图片描述

package com.company;

public class MyClass {

    public String getName() {
        return "嘿嘿";
    }
}

package com.company;

public interface MyFun {
    /**
     * 接口中的默认方法,用default修饰
     *
     * @return
     */
    default String geName() {
        return "哈哈";
    }

    /**
     * 接口中的静态方法的调用
     * 类名.静态方法名()
     */
    public static void say(){
        System.out.println("接口中的静态方法");
    }
}


package com.company;
public class SubClass extends MyClass implements MyFun{
}

package com.company;

public class DefaultInterfaceTest {
    public static void main(String[] args) {
        SubClass sc = new SubClass();
        String str = sc.geName();
        System.out.println(str);
    }
}

输出 哈哈

时间和日期

传统时间格式化

package com.company;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.*;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2023/2/18
 * @Description 传统时间格式化线程问题
 */
public class SimpleDateFormatTest {
    public static void main(String[] args) throws Exception {
        SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");
        Callable<Date> task = new Callable<Date>() {
            @Override
            public Date call() throws Exception {
                return sf.parse("20230218");
            }
        };

        // 固定数量的线程池
        ExecutorService pool = Executors.newFixedThreadPool(10);
        List<Future<Date>> results = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            results.add(pool.submit(task));
        }
        for (Future<Date> future : results) {
            System.out.println(future.get());
        }
    }
}

上述代码,出现日期格式解析失败,修复代码如下

package com.company;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2023/2/18
 * @Description
 */
public class DateFormatThreadLocal {

    private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() {
        @Override
        protected DateFormat initialValue() {
            return new SimpleDateFormat("yyyyMMdd");
        }
    };

    public static Date convert(String source) throws Exception {
        return df.get().parse(source);
    }
}

package com.company;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.*;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2023/2/18
 * @Description 传统时间格式化线程问题
 */
public class SimpleDateFormatTest {
    public static void main(String[] args) throws Exception {
        SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");
        Callable<Date> task = new Callable<Date>() {
            @Override
            public Date call() throws Exception {
                return DateFormatThreadLocal.convert("20230218");
            }
        };

        // 固定数量的线程池
        ExecutorService pool = Executors.newFixedThreadPool(10);
        List<Future<Date>> results = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            results.add(pool.submit(task));
        }
        for (Future<Date> future : results) {
            System.out.println(future.get());
        }
        // 关闭线程
        pool.shutdown();
    }
}

jdk8中的日期

在这里插入图片描述

package com.company;

import org.junit.Test;

import java.time.*;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2023/2/18
 * @Description
 */
public class DateDemo {

    /**
     * 系统当前时间
     */
    @Test
    public void test1() {
        LocalDateTime ldt = LocalDateTime.now();
        System.out.println(ldt);

        LocalDateTime ldt2 = LocalDateTime.of(2023, 2, 18, 22, 10);
        System.out.println(ldt2);

        LocalDateTime ldt3 = ldt.plusYears(2);
        System.out.println(ldt3);

        LocalDateTime ldt4 = ldt.minusMonths(2);
        System.out.println(ldt4);

    }

    /**
     * Instant:时间戳(以Unix元年:1970年1月1日 00:00:00)
     */
    @Test
    public void test2() {
        //默认获取UTC时区
        Instant now = Instant.now();
        System.out.println(now);

        // 偏移量
        OffsetDateTime of = now.atOffset(ZoneOffset.ofHours(8));
        System.out.println(of);

        // 毫秒时间
        System.out.println(now.toEpochMilli());

        // 秒
        Instant instant = Instant.ofEpochSecond(1000);
        System.out.println("instant=" + instant);
    }

    /**
     * Duration:计算两个“时间”之间的间隔
     */
    @Test
    public void test3() {
        Instant ins1 = Instant.now();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Instant ins2 = Instant.now();
        Duration duration = Duration.between(ins1, ins2);
        // 获取时间以秒为单位
        System.out.println("秒=" + duration.getSeconds());
        // 获取毫秒
        System.out.println("毫秒=" + duration.toMillis());
    }

    /**
     * Period:计算两个“日期”之间的间隔
     */
    @Test
    public void test4() {
        LocalDate ld1 = LocalDate.of(2022, 1, 5);
        LocalDate ld2 = LocalDate.now();
        Period period = Period.between(ld1, ld2);
        System.out.println("相差年数:" + period.getYears());
        System.out.println("相差月数:" + period.getMonths());
        System.out.println("相差天数:" + period.getDays());
    }
}

时间校正器

在这里插入图片描述

package com.company;

import org.junit.Test;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2023/2/19
 * @Description
 */
public class DateDemo2 {
    /**
     * 时间校正器 TemporalAdjuster
     */
    @Test
    public void test1() {
        LocalDateTime ldt1 = LocalDateTime.now();
        System.out.println("ldt1=" + ldt1);
        LocalDateTime ldt2 = ldt1.withDayOfMonth(10);
        System.out.println("ldt2=" + ldt2);
    }

    @Test
    public void test2() {
        LocalDate nextSunday = LocalDate.now().with(
                TemporalAdjusters.next(DayOfWeek.SUNDAY)
        );
        System.out.println("下个周日:" + nextSunday);

         // 下一个工作日
        LocalDateTime now = LocalDateTime.now();
        now = now.with(e ->{
           LocalDateTime temp=(LocalDateTime) e;
            if (temp.getDayOfWeek()==DayOfWeek.FRIDAY)
            {
                temp=temp.plusDays(3);
            }else if (temp.getDayOfWeek()==DayOfWeek.SATURDAY)
            {
                temp=temp.plusDays(2);
            }else {
                temp=temp.plusDays(1);
            }
           return temp;
        });
        System.out.println("下一个工作日=" + now);
    }

    /**
     * DateTimeFormatter:格式化时间/日期
     */
    @Test
    public void test3() {
        DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE_TIME;
        LocalDateTime ldt = LocalDateTime.now();
        String str = ldt.format(dtf);
        System.out.println(str);
        System.out.println("----------------------------");

        DateTimeFormatter df2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
        String strDate2 = df2.format(ldt);

        LocalDateTime newDate = LocalDateTime.parse(strDate2, df2);
        System.out.println(newDate);
    }
}

时区的处理

在这里插入图片描述

package com.company;

import org.junit.Test;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;

public class DateDemo2 {
    /**
     * ZoneDate、ZonedTime、ZonedDateTime
     */
    @Test
    public void test4() {
        LocalDateTime ldt = LocalDateTime.now(ZoneId.of("Europe/Tallinn"));
        // 2023-02-19T17:53:10.695
        System.out.println(ldt);
        System.out.println("---------------------");
        LocalDateTime ldt2 = LocalDateTime.now();
        ZonedDateTime zdt = ldt.atZone(ZoneId.of("Europe/Tallinn"));
        // 2023-02-19T17:53:10.695+02:00[Europe/Tallinn]
        System.out.println(zdt);
    }
}

重复注解与类型注解

在这里插入图片描述

package com.company;

import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2023/2/20
 * @Description @Repeatable:可重复的注解
 * MyAnnotations.class:容器类
 */

@Repeatable(MyAnnotations.class)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE,TYPE_PARAMETER})
@Retention(RetentionPolicy.SOURCE)
public @interface MyAnnottation {


    String value() default "atguigu";

}

package com.company;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.ElementType.LOCAL_VARIABLE;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2023/2/20
 * @Description
 */
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotations {

    MyAnnottation[] value();
}

package com.company;

import org.junit.Test;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author Helen
 * @version 1.0
 * @createTime 2023/2/20
 * @Description
 */
public class TestAnnotation {

    @Test
    public void test() throws Exception {
        Class<TestAnnotation> clazz = TestAnnotation.class;
        Method method = clazz.getMethod("show");
        MyAnnottation[] mas = method.getAnnotationsByType(MyAnnottation.class);
        for (MyAnnottation m : mas) {
            System.out.println(m.value());
        }
    }

    @MyAnnottation("Hello")
    @MyAnnottation("World")
    public void show() {

    }
}

输出
Hello
World

wxComboBox类的使用方法及示例代码 其中,parent表示该控件的父窗口,ID_COMBOBOX是该控件的ID,用于在事件处理函数中区分不同的控件,"默认选项"是下拉列表框的默认选项,options是wxArrayString类型的数组,用于存储下拉列表框中的选项,style可以指定wxComboBox的样式。wxComboBox是wxWidgets中的一个常用控件,它可以被用来显示一组在下拉列表框中的选项,并允许用户从中选择一个选项。上述就是wxComboBox类的基本使用方法,使用这个控件可以方便地实现下拉列表框的功能。 阅读详情

相关推荐

告别命令行!用这个开源的Web版Kettle工具,5分钟搞定数据集成任务编排

本文介绍了一款开源的Web版Kettle工具,通过直观的拖拽界面大幅提升数据集成效率,告别复杂的命令行操作。该工具基于Kettle核心引擎,支持跨平台协作、轻量化访问和降低学习曲线,特别适合业务分析师快速上手。实测显示,使用该工具后任务配置错误率下降62%,协作效率提升40%。

weixin_30267785的博客 433

Java8的主要新特性

默认方法在子类也可以被重写。interface 的设计初衷是面向抽象,提高扩展性。这也留有一点遗憾,Interface 修改的时候,实现它的类也必须跟着改。于是1.8之后,interface中修改方法,可以加static或default修饰,这样子类不用一定要实现,并且可以直接调用。

Zero摄氏度的博客 1382

百度地图街景图像批量获取

由于个人研究需要在最近试了一下使用API获取百度地图街景图片,在此介绍一下基于我个人需求的百度街景批量获取方法,本文以Python编码作为主要方法,如果对零编码工具有需要的可以关注一下UA城市分析小组刚刚发布的街景图片获取工具。 街景图像用作区域细粒度空间指标测度需要解决几个问题。 1. 首先就是调用额度的限制,现在百度对于个人认证开发者每天可用的街景图像调用额度为100张,在不考虑购买额度上限(1万张600元,其实有经费的前提下可以直接考虑钞能力)的情况下动辄几千上万张的爬取数量会大大增加需要爬取的时间周

boycetoon29的博客 1万+

JAVA 8 的新特性

前段时间面了完美世界,被问到Java8的新特性,在此特地记录一下,虽然现在Java的版本可能已经很高了,但是Java8的新特性依然值得学习一下!

qq_36488864的博客 3280

扫地机器人:从仿真到决策,一个完整SLAM导航系统的自研之路

本文详细记录了从零开始自研扫地机器人SLAM导航系统的全过程,涵盖ROS-Gazebo仿真系统搭建、地图预处理优化、全覆盖规划算法迭代等关键技术。通过三次算法升级,最终实现92%的清洁效率,并分享DWA调参、状态机设计等实战经验,为开发者提供从仿真到落地的完整解决方案。

weixin_29053695的博客 352

基于FPGA的UDP 通信(六)

本文基于FPGA和MATLAB对千兆以太网通信模块UDP数据发送(FPGA发送)进行联合调试。

记录所学,分享知识,结识挚友 4728

Java8新特性详解

说明:新的专栏,本专栏专门讲Java8新特性,把平时遇到的问题与Java8的写法进行总结,需要注意的地方都标红了,一起加油。 本文是介绍Java8新特性与常用方法(此篇只做大体介绍了解,之后会把重要的部分写在新的博客中)

biyn9的博客 2021

基于电能质量治理的场景实例:统一电能质量调节器(UPQC)与并网逆变器集成

本文通过Simulink平台,详细演示了统一电能质量调节器(UPQC)与并网逆变器的集成系统建模与仿真过程。主要内容包括:1)系统架构设计,包含光伏并网系统、非线性负载和电压扰动源;2)UPQC主电路设计,包括串联/并联单元拓扑和控制策略实现;3)与并网逆变器的能量交互与协同控制逻辑;4)典型电能质量问题的仿真测试场景。结果表明,该集成系统能有效治理电压暂降(维持负载电压380V±2%)和电流谐波(电网THD<3%),直流母线电压稳定在800V±5V。该系统为应对复杂电能质量问题提供了"电压

xiaoheshang_123的博客 309

史上最全Java8新特性详解

史上最全Java8新特性详解

小学生波波 2678

TIP 2024 | 跨类与跨域语义增强用于域泛化

域泛化方法旨在通过多样化的源域帮助开发一个在未知目标域上表现良好的通用模型。数据增强已被证明是增强计算机视觉中域泛化的有效方法。最近,基于语义级别的数据增强取得了显著成果。然而,这些方法主要集中在从类内和域内采样语义方向,限制了源域的多样性。为了解决这个问题,作者提出了一种新的方法,称为跨类与跨域语义增强(CDSA)。首先,作者引入了一种基于采样的方法CrossSmooth,从跨类中获取语义方向。然后,CrossVariance通过采样语义方向获取不同域的样式。

小白学视觉 210

【Flutter 问题系列第 85 篇】Xcode 运行 Flutter 提示 The Dart VM Service was not discovered after 60 seconds.

在 Xcode 上运行 Flutter 时提示 `The Dart VM Service was not discovered after 60 seconds. This is taking much longer than expected...`,意思是 `60秒后未发现Dart虚拟机服务。这比预期的要长得多`

“Allen Su”的博客 2235

重学Java 8新特性 | 第1讲——我们为什么要学习Java 8新特性?

为什么我们一定要学习Java 8新特性?

李阿昀的博客 1721

通过Simulink搭建一个智能微电网能量管理系统(Energy Management System, EMS)

通过上述代码实现,您可以逐步创建一个智能微电网能量管理系统。多源能量集成:整合光伏、风力发电、柴油发电机、电池储能等多种能源资源。负荷预测与调度:基于历史数据和天气预报,预测未来负荷和可再生能源输出,进行优化调度。储能系统优化:设计合理的充放电策略,确保储能系统的高效利用和寿命延长。经济性分析:评估不同运行模式下的经济性,考虑电价、维护成本等因素。环境影响评估:分析微电网对环境的影响,如减少碳排放、提高可再生能源利用率等。硬件在环仿真(HILS)

amy_mhd的博客 314

学习札记-Java8系列-1-Java8新特性简介&为什么要学习Java8

Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,距离现在已经有很长一段时间了,Java10也在2018年 3月 21日正式发布,并且Oracle宣布Java 语言将每隔 6 个月提供一次更新。Java语言不断更新迭代,然而很多Java程序员缺没有跟上技术更新的步伐!所以写下这篇系列文章,希望可以帮助大家入门Java8!话不多说,开始发车!

pingguocu3的博客 972

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

java8 新特性学习

java 8 新特性学习 java 8的一些新特性。 目录 接口的默认方法

疯狂的三十哥的博客 158

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

java学习笔记16——java8的其他新特性

这是JDK9的新特性1.命令行中通过指令jshell,调取jshell工具2.常用指令:/help:获取关使用 jshell 工具的信息/help intro : jshell 工具的简介/list :列出当前 session 里所有有效的代码片段/vars :查看当前 session 下所有创建过的变量/methods :查看当前 session 下所有创建过的方法/imports :列出导入的包/history :键入的内容的历史记录。

qq_58956810的博客 890

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

快速学习Java8新特性第一讲——Java8新特性简介

在这一讲中,大家要对接下来要学习的Java8新特性做一个粗略的了解,以便从全局上对Java8新特性有一个整体的认识。Java8好像是2014年3月份发布的,一直到2019年12月份,我才开始学习Java8新特性,确实是说不过去,现在开始学,还晚吗?不管了,直接学就行了!有一点我得说道说道,公司往往不是追求技术的新,而且追求技术的稳定,所以有可能在咱们的实际项目中还没有用到Java8新特性,学了它,...

李阿昀的博客 1091

java 8 新特性学习

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、Lambda 是什么?二、基本语法三、自己练习深刻理解使用四、java 8 四大内置核心函数式接口 前言 优化简洁的开发Java 8新特性 Lambda 表达式 一、Lambda 是什么? Lambda 是Jdk 1.8 的一种新特性。 优点: 速度更快 代码更少 强大的 Stream API 便于并行 最大减少空指针异常 Optical 二、基本语法 //1.无参无返回Lambda 表达式 .

qq_45007035的博客 643

Java8新特性学习笔记

文章目录 int[] is = Arrays.asList(this.childFolderId.split("")).stream().mapToInt(s -> {return Integer.parseInt(s);}).toArray();

CunShine_2016的博客 223

实战学习Java8 Stream新特性

学会使用java8的Stream新特性,可以极大的减少工作中的代码量,可以使自己的代码看起来更整洁,同时很多框架源码中也大量使用Stream,掌握了它也可以为我们阅读源码提供帮助,希望这篇文章可以给大家带来帮助。

weixin_44584422的博客 631

Java学习之路——Java8 新特性

Java学习之路——Java8 新特性 概述 虽说 JDK 每个新版本相较于上一个版本都有一些新特性,但是因为 JDK8 是行业中使用最为广泛的版本,因此它的新特性是我们需要了解并使用的。这些新特性能够帮助我们更好的进行编程。 一、Lambda 表达式 Lambda 表达式,也可称为闭包,它允许把函数作为一个方法的参数(函数作为参数传递进方法中),能够使代码变的更加简洁紧凑。 语法 (parameters) -> expression // 或 (parameters) ->{ statemen

海纳百川 213

JAVA8新特性学习

JAVA8的出现,为程序员们带了了很多的方便,新增加了很多新的特性,现在和大家一起学习学习。 1、Java8允许我们对接口添加一个默认的非抽象的实现类。只需要default关键字即可,这个特征又叫做扩展方法:                例如:                        interface    Test{

雪莲嘉乐--专栏 457

Java8新特性总结学习

文章目录Lambda:为什么使用Lambda表达式 ?Lambda表达式语法 ?什么是函数式接口 ?Lambda 表达式的基本语法:Lambda 四大内置核心函数式接口:Consumer:消费型接口:Supplier:供给型接口:Function: 函数型接口:Predicate:断言型接口:方法引用与构造器引用:创建 Stream:Stream_筛选与切片emps:filter--接收Lambd...

小飞技术 1505

java8新特性学习总结

java8新特性简介 速度更快(对jvm内存结构进行了优化) 代码更少(增加了新的语法Lambda表达式) 强大的StreamAPI(可以对集合进行流化处理:过滤,截取,分组,归约,收集,运算) 便于并行(基于fork/join框架) 最大化减少空指针异常(Optional类) java8新特性有哪些 Lambda表达式(核心) 函数式接口 方...

TechnicalFollower的专栏 209

Java8 新特性学习

1、接口中的默认方法 Java8中允许接口中包含具有具体实现的方法,这种方法被称为“默认方法”,使用default关键字修饰。 如: public interface MyInterface { String notDefault(); default String testDefault() { return "Hello Default Metho...

innerpeacez成长之路 5499

尚硅谷Java8 新特性学习笔记

Java 8 一、介绍 1、生态 Lambda 表达式 函数式接口 方法引用 / 构造器引用 Stream API 接口中的默认方法 / 静态方法 新时间日期 API 其他新特性 2、新特性 速度更快 代码更少 强大的 Stream API 便于并行 最大化减少空指针异常 Optional (Kotlin ?) 3、温故而知新 Hashmap 底层结构/原理 老话题不再阐述 … 并发hashmap … Java虚拟机 … Java内存模型 … 二、Lambda 表达式 Lambd

Mark42的博客 4894
上一篇: go语言可以做什么
下一篇: RocketMQ概述
迷失的小鹿
博客等级 码龄8年 1万+粉丝 199原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值