Java 8和Java 11概述


Java世界中引入的一个重大新闻与版本周期有关,我们每六个月发布一次,每三年发布一次长期支持版本。当前,LTS版本是Java 11,许多公司都在从Java 11开始使用它。首先,这一运动意义重大,因为新框架将不支持Java 8,并且将考虑Java 11作为下一个LTS将于2021年9月发布的Java 11的最低标准。基本的API在Java 8和Java 11之间发生。

该 功能类 从Java 8开始,将作为基础的重要一点是java.util.function包中的新接口,在此概述中,我们将看到隐蔽的四个接口:

Function: 表示一个接受一个参数并产生结果的函数:

import java.util.function.Function;
public class FunctionApp {

    public static void main(String[] args) {
        Function<String, Integer> toNumber = Integer::parseInt;
        System.out.println("To number: " + toNumber.apply("234"));
        Function<String, String> upperCase = String::toUpperCase;
        Function<String, String> trim = String::trim;
        Function<String, String> searchEngine = upperCase.andThen(trim);
        System.out.println("Search result: " + searchEngine.apply("   test one two   "));

    }
}

Predicate: 表示一个参数的谓词 (boolean-valued function) .

import java.util.function.Predicate;

public class PredicateApp {

    public static void main(String[] args) {
        Predicate<String> startWithA = s -> s.startsWith("A");
        Predicate<String> startWithB = s -> s.startsWith("B");
        System.out.println(startWithA.and(startWithB).test("Animal"));
    }
}

Supplier: 代表结果的提供者。

import java.util.Optional;
import java.util.function.Supplier;

public class SupplierApp {

    public static void main(String[] args) {
        Supplier<String> cache = () -> "From Database";
        Optional<String> query = Optional.empty();
        System.out.println(query.orElseGet(cache));
    }
}

Consumer: 表示一个接受单个输入参数且不返回结果的操作。

import java.util.function.Consumer;

public class ConsumerApp {

    public static void main(String[] args) {
        Consumer<String> log = s -> System.out.println("The log " +s);
        Consumer<String> logB = s -> System.out.println("The logB " +s);
        log.andThen(logB).accept("The value A");
    }
}

在这些接口上,我们将看到一些改进,例如在Collections实现中:

public class ListApp {

    public static void main(String[] args) {
        List<String> fruits = new ArrayList<>(List.of("Bananas", "Melon", "Watermelon"));
        fruits.forEach(System.out::println);
        fruits.removeIf("Bananas"::equals);
        fruits.sort(Comparator.naturalOrder());
        System.out.println("After sort: ");
        fruits.forEach(System.out::println);
    }
}

public class SetApp {

    public static void main(String[] args) {
        Set<String> fruits = new HashSet<>(List.of("Bananas", "Melon", "Watermelon"));
        fruits.forEach(System.out::println);
        fruits.removeIf("Bananas"::equals);
        System.out.println("After sort: ");
        fruits.forEach(System.out::println);
    }
}

public class MapApp {

    public static void main(String[] args) {
        Map<String, String> medias = new HashMap<>();
        medias.put("facebook", "otaviojava");
        medias.put("twitter", "otaviojava");
        medias.put("linkedin", "otaviojava");
        System.out.println("The medias values " + medias);
        medias.forEach((k, v) -> System.out.println("the key: " + k + " the value " + v));
        medias.compute("twitter", (k, v) -> k + '-' + v);
        System.out.println("The medias values " + medias);
        medias.computeIfAbsent("social", k -> "no media found: " + k);
        medias.computeIfPresent("social", (k, v) -> k + " " + v);
        System.out.println("The medias values " + medias);
        medias.replaceAll((k, v) -> v.toUpperCase(Locale.ENGLISH));
        System.out.println("The medias values " + medias);
    }
}

此外,还有一些新的方法工厂可以简化创建集合接口的过程:

import java.util.List;
import java.util.Map;
import java.util.Set;

public class MethodFactory {

    public static void main(String[] args) {
        List<String> fruits = List.of("banana", "apples");
        Set<String> animals = Set.of("Lion", "Monkey");
        Map<String, String> contacts = Map.of("email", "me@gmail.com", "twitter", "otaviojava");
    }
}

流是支持顺序和并行聚合操作的一系列元素。我们可以考虑瀑布或河流。该API健壮且简洁,可以操纵集合,例如:

public class StreamApp {

    public static void main(String[] args) {
        List<String> fruits = List.of("Banana", "Melon", "Watermelon");
        fruits.stream().sorted().collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList));
        fruits.stream().sorted().collect(Collectors.toUnmodifiableList());
        Map<Boolean, List<String>> startWithB = fruits.stream().collect(Collectors.partitioningBy(f -> f.startsWith("B")));
        System.out.println("Start with B " + startWithB);
        Map<String, List<String>> initials = fruits.stream().collect(Collectors.groupingBy(s -> s.substring(0)));
        System.out.println("Initials: " + initials);
    }
}
public class StreamReduceApp {
3
4
    public static void main(String[] args) {
        List<BigDecimal> values = List.of(BigDecimal.ONE, BigDecimal.TEN);
        Optional<BigDecimal> total = values.stream().reduce(BigDecimal::add);
        System.out.println(total);
    }
}

当Java 8发布时, 新的Date and Time API具有新的类型,不可变的类,实用的新闻方法,最后是 Enums 到星期和几个月的日期,而不是数字。

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Month;
import java.time.Year;
import java.time.YearMonth;
import java.util.Arrays;

public class DateApp {

    public static void main(String[] args) {
        System.out.println("LocalDateTime: " + LocalDateTime.now());
        System.out.println("Localdate: " + LocalDate.now());
        System.out.println("LocalDateTime: " + LocalDateTime.now());
        System.out.println("YearMonth: " + YearMonth.now());

        System.out.println("Days of weeks: " + Arrays.toString(DayOfWeek.values()));
        System.out.println("Months: " + Arrays.toString(Month.values()));
    }
}

作为当前的LTS,Java 11具有多种功能,使开发人员的日常工作更加轻松。这篇文章只是概述,很快就开始使用Java 11,但错过了一些Java8。每个新版本都有很多关于此功能的参考。


原文链接:https://codingdict.com/