> Java > Java시작하기 > JDK8의 새로운 기능에 대한 자세한 소개

JDK8의 새로운 기능에 대한 자세한 소개

王林
풀어 주다: 2019-11-26 13:45:05
앞으로
3063명이 탐색했습니다.

JDK8의 새로운 기능에 대한 자세한 소개

함수형 프로그래밍

객체 지향은 "모든 것이 객체이다"라고 강조합니다. 무언가를 하고 싶다면 그것을 할 객체를 찾아야 합니다. 함수형 프로그래밍 아이디어는 "어떻게 해야 하는가"보다는 "무엇을 해야 하는가"를 강조합니다.

일반적으로 스레드 열기

// 匿名内部类对象
Runnable task = new Runnable() {
    @Override
    public void run() {
        System.out.println("乌鸦坐飞机");
    }
};
new Thread(task).start();
로그인 후 복사

더 많은 Java 관련 무료 비디오 튜토리얼: java 온라인 튜토리얼

스레드를 여는 함수형 프로그래밍

new Thread(() -> System.out.println("龙卷风摧毁停车场")).start();
로그인 후 복사

앞의 괄호: 메소드 매개변수, 매개변수가 없는 경우 ( ), 화살표는 나중에 수행해야 할 작업을 가리킵니다. 화살표 뒤에는 수행할 특정 콘텐츠를 나타내는 메서드 본문 중괄호와 같습니다.

Lambda 표현식

클로저라고도 알려진 Lambda 표현식은 Java 8 출시를 주도하는 가장 중요한 새로운 기능입니다.

Lambda를 사용하면 함수를 메서드의 매개 변수로 사용할 수 있습니다(함수는 메서드에 매개 변수로 전달됩니다). 람다 표현식을 사용하면 코드를 더욱 간결하고 간결하게 만들 수 있습니다.

세 가지 요소: 매개변수, 화살표, 코드

형식: (매개변수 유형 매개변수 이름) -> {일부 코드}

람다 표현식 사용을 위한 전제 조건: 인터페이스가 있어야 하며 하나만 있어야 합니다. 인터페이스 메소드의 하나의 추상화

데모: makeFood() 메소드를 사용하여 Cook 인터페이스 작성

public static void main(String[] args) {
    method(() -> {
        System.out.println("闪刀启动!");
    });
}
 
private static void method(Cook cook) {
    cook.makeFood();
}
로그인 후 복사

Lambda 표현식 생략 규칙:

매개변수 유형은 생략할 수 있습니다. 그러나 모든 매개변수의 유형을 동시에 생략하거나 아예 생략할 수는 없습니다. 매개변수가 하나뿐이면 중괄호 안에 명령문이 하나만 있으면 괄호를 생략할 수 있습니다. 그러면 반환 값이 있든 없든 상관없이 반환, 중괄호 괄호, 세미콜론은 생략 가능합니다.

    public static void main(String[] args) {
        method((a, b)-> a + b);
    }
 
    private static void method(Calculator calculator) {
        int result = calculator.sum(1234, 9876);
        System.out.println(result);
    }
로그인 후 복사

새 인터페이스를 만들 때 익명의 내부 클래스 대신 람다 식을 사용할 수도 있습니다.

Runnable task = () -> System.out.println("闪刀启动!");
new Thread(task).start();
로그인 후 복사

기능적 인터페이스

인터페이스에는 기능적 인터페이스라고 하는 추상 메서드가 하나만 있습니다.

인터페이스가 기능적 인터페이스인지 여부를 감지하는 데 사용되는 @FunctionalInterface 주석이 JDK8에 추가되었습니다. 기능적 인터페이스가 아닌 경우 컴파일 중에 오류가 보고됩니다. @FunctionalInerface 주석은 선택 사항입니다. 이 주석을 사용하지 않더라도 인터페이스가 기능적 인터페이스의 정의 요구 사항을 충족하는 한 여전히 기능적 인터페이스입니다. @FunctionalInterface,用于检测一个接口是否为函数式接口。如果不是函数式接口,编译时会报错。@FunctionalInerface注解是可选的,就算不用这个注解,只要保证接口满足函数式接口的定义要求,也一样是函数式接口。

@FunctionalInterface
public interface MyInterface {
    void method();
}
로그인 후 복사

方法引用

Printer printer = (str) -> System.out.println(str);这段代码实际上可以简写。

只要是可推导的,就是可引用的,因此传参其实并没有意义,因此这里其实可以使用方法引用来简写 System.out::println

从java8开始,引入了一个全新的运算符,方法引用符(两个冒号连着写),所在的表达式就是一个方法引用,方法引用和Lambda本质是完全一样的,目的就是简化Lambda表达式的写法。

Lambda的写法:s->System.out.println(s)

方法引用写法:System.out::println

 
    public static void main(String[] args) {
        method(System.out::println);
    }
 
    private static void method(Printer printer) {
        printer.print("hello");
    }
로그인 후 복사

메서드 참조

프린터 프린터 = (str) -> System.out.println(str);이 코드는 실제로 축약될 수 있습니다.

연역 가능한 한 인용할 수 있으므로 매개변수 전달은 실제로 의미가 없으므로 여기서는 실제로 메소드 참조를 사용하여 System.out::println을 축약할 수 있습니다.

java8부터 시작해서, 완전히 새로운 연산자가 추가되고, 메소드 참조 연산자(콜론 2개 연속 작성)가 포함되어 있으며, 여기에 포함된 표현식은 메소드 참조와 람다의 본질은 완전히 동일하며, 작성을 단순화하는 것이 목적입니다. 람다 표현식.

Lambda 작성 방법: s->System.out.println(s)

메서드 참조 작성 방법: System.out::println

두 가지 방법 완전히 동일함

/**
 * 从java8开始,接口当中允许定义default默认方法
 * 修饰符:public default(public可以省略,default不能省略)
 */
public interface MyInterface {
 
    void method1();
 
    void method2();
 
    default void methodNew() {
        System.out.println("接口默认方法执行");
    }
 
}
로그인 후 복사

Interface

기본 메소드

Interface에는 원래 두 개의 추상 메소드가 있었지만 이제 세 개의 추상 메소드로 전환해야 합니다. 이때 구현 클래스도 새로운 메소드를 구현해야 합니다.

구현 클래스가 너무 많으면 작동이 매우 번거롭습니다. JDK는 확장을 위해 개방하고 수정을 위해 폐쇄하는 개방형 디자인 모드를 사용했습니다. 즉, 새 인터페이스를 만들고, 원래 인터페이스를 상속하고, 새 메서드를 정의합니다. 그러나 이 경우 원래 구현 클래스에는 새 메서드가 없습니다. 인터페이스 기본 메서드를 사용할 수 있습니다.

키워드는 기본으로 수정되며, 메소드에는 메소드 본문이 필요합니다. 해당 메서드의 모든 하위 클래스는 기본적으로 구현됩니다(직접 작성할 필요는 없습니다). 이를 재정의하려면 구현 클래스에서 재정의할 수도 있습니다.

public interface Animal {
 
    void eat();
 
    static Animal getAnimal() {
        return new Cat();
    }
}
로그인 후 복사
참고: 기본 메서드는 인터페이스는 new 키워드와 동일하며 네 가지 수정자의 "기본값"은 동일한 개념이 아닙니다.

기본 키워드를 사용하면 프로그램이 "다중 상속" 효과를 얻을 수 있습니다.

정적 메소드

java8부터는 인터페이스에서 정적 메소드 정의가 허용되며, 사용법은 일반 클래스의 정적 메소드와 동일합니다.

List<Integer> evens = new ArrayList<>();
for (final Integer num : nums) {
    if (num % 2 == 0) {
        evens.add(num);
    }
}
로그인 후 복사

🎜스트리밍 작업🎜🎜🎜스트리밍 처리가 개발자에게 주는 첫인상은 일반적으로 여러 줄의 코드가 필요한 작업을 스트리밍 처리를 통해 한 줄로 완료할 수 있다는 것입니다. 🎜🎜예를 들어, 정수가 포함된 집합에서 모든 짝수를 필터링하고 이를 새 목록으로 캡슐화하여 반환하려면 java8 이전에 다음 코드를 통해 이를 구현해야 합니다. 🎜🎜숫자 집합의 경우 : 🎜
List<Integer> evens = nums.stream().filter(num -> num % 2 == 0).collect(Collectors.toList());
로그인 후 복사
🎜Java8의 스트리밍 처리를 통해 다음과 같이 코드를 단순화할 수 있습니다. 🎜
        //初始化list集合
        List<String> list = new ArrayList<String>();
        list.add("测试数据1");
        list.add("测试数据2");
        list.add("测试数据3");
        list.add("测试数据12");
        
        //使用λ表达式遍历集合
        list.forEach(s -> System.out.println(s));
        
        //结合Predicate使用和过滤条件筛选元素
        Predicate<String> contain1 = n -> n.contains("1");
        Predicate<String> contain2 = n -> n.contains("2");
        
        //根据条件遍历集合
        list.stream().filter(contain1).forEach(n -> System.out.println(n));
        list.stream().filter(s -> contain1.test(s)).forEach(s -> System.out.println(s));
        list.stream().filter(contain1.and(contain2)).forEach(n -> System.out.println(n));
        list.stream().filter(contain1.or(contain2)).forEach(n -> System.out.println(n));
        
        //将过滤后的元素重新放到一个集合中
        List<String> newList = list.stream().filter(contain1.and(contain2)).collect(Collectors.toList());
        
集合中decimal求和
		BigDecimal sum = list
				.stream()
				.map(Person::getAmount)
				.reduce(BigDecimal::add)
				.get();
 
//排序 , 也需要新的集合接收
	List<Student> resultList = new ArrayList<Student>();
	resultList = list.stream().sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList())
로그인 후 복사
로그인 후 복사
🎜먼저 위 명령문 줄의 의미를 간략하게 설명합니다. stream() 작업은 컬렉션을 스트림으로 변환하고 filter()는 사용자 정의를 수행합니다. 필터링 처리, 여기서는 람다 식을 통해 모든 짝수를 필터링하고 마지막으로 Collect()를 통해 결과를 캡슐화하고 Collectors.toList()를 통해 목록 컬렉션으로 캡슐화를 지정하고 반환합니다. 🎜

常用操作案例:

        //初始化list集合
        List<String> list = new ArrayList<String>();
        list.add("测试数据1");
        list.add("测试数据2");
        list.add("测试数据3");
        list.add("测试数据12");
        
        //使用λ表达式遍历集合
        list.forEach(s -> System.out.println(s));
        
        //结合Predicate使用和过滤条件筛选元素
        Predicate<String> contain1 = n -> n.contains("1");
        Predicate<String> contain2 = n -> n.contains("2");
        
        //根据条件遍历集合
        list.stream().filter(contain1).forEach(n -> System.out.println(n));
        list.stream().filter(s -> contain1.test(s)).forEach(s -> System.out.println(s));
        list.stream().filter(contain1.and(contain2)).forEach(n -> System.out.println(n));
        list.stream().filter(contain1.or(contain2)).forEach(n -> System.out.println(n));
        
        //将过滤后的元素重新放到一个集合中
        List<String> newList = list.stream().filter(contain1.and(contain2)).collect(Collectors.toList());
        
集合中decimal求和
		BigDecimal sum = list
				.stream()
				.map(Person::getAmount)
				.reduce(BigDecimal::add)
				.get();
 
//排序 , 也需要新的集合接收
	List<Student> resultList = new ArrayList<Student>();
	resultList = list.stream().sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList())
로그인 후 복사
로그인 후 복사

推荐java相关文章:java零基础入门

欢迎大家一起来学习!

위 내용은 JDK8의 새로운 기능에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿