em Java8

De descerrar

prefácio

Projeto uso ocasional Java8, para compreender algum uso básico, mas não tem tempo para aprender o sistema, de modo algum do conceito bastante vago, não uma compreensão completa, recentemente colocou alguns tutoriais e livros olhou atentamente, de repente senti muito antes alguns não entendem o conceito também classificar para fora, aqui resumida.

A programação funcional (para a declaração, ao invés de processo)

Em Java8, você vai ver um monte de estilo semelhante ao seguinte código: usando expressões Labmda. O texto é um estilo declarativo da escrita: dizer ao computador o que fazer, em vez de como fazê-lo.

//我们通过函数声明式的过滤出我们想要的结果。而不是在写个for循环做条件判断,然后筛选结果(过程式)
Arrays.asList(1, 3, 4, 5, 10).stream().filter(v -> v > 5).collect(Collectors.toList());
复制代码

interface de função

Apenas um método abstrato, pode ter implementação padrão múltiplo da interface. Uma interface de função é definida como se segue:

@FunctionalInterface //添加这个注解后,编译器会检查当前的接口是否符合函数接口规范
public interface Formula {
    double calucalte(int value);

    default int sum(int v1, int v2) { //默认实现方法,当实现接口时可以不实现
        return v1 + v2;
    }

    default double maxValue(Double... values) {//计算所给参数的最大值
        return Arrays.stream(values).max(Double::compareTo).orElse(0.0);
    }
}

复制代码

O método de interface padrão

  • Por que você precisa este recurso

Interface antes que os benefícios são abstratos orientada ao invés de falha de programação específica é que quando você precisa modificar a interface, a necessidade de modificar a classe de interface tudo se realizar. Para a versão foi liberada, não há como não afetar as implementações existentes na adição de novos métodos para a interface ao mesmo tempo. Eu acho que é uma boa explicação aqui: ligação

As expressões lambda

  • Por que usar expressões lambda?

Tal que, para alcançar uma forma mais simples, os códigos de forma mais clara, o código da interface de teste acima:

//Java8以前的做法:实例化接口
Formula formu = new Formula() {
  @Override
   public double calucalte(int value) {
        return sum(value, 10);//可以直接调用接口中的默认实现方法
   }
};
System.out.println(formu.calucalte(10));
//使用Lambda表达式的做法:本质上还是接口实现。
Formula formula = a -> a + 1;//语法:参数列表->Lambda主体(相当于函数接口的实现),编译器会对参数类型进行判断
System.out.println(formula.maxValue());
复制代码

A função de transferência

Java biblioteca de classes no núcleo, a função de transferência pode ser visto no processo, o valor mais baixo é Collectionsum método de classe:

//Java8之前:
List<Integer> values = Arrays.asList(9, 1, 2, 4, 5);
Collections.sort(values, new Comparator<Integer>() {//往方法中传递函数的代码,该方法需要用到函数的执行结果
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1.compareTo(o2);
    }
});
//Java8:一行代码解决
Collections.sort(values, Integer::compareTo);//方法引用:复用已存在的方法
复制代码

JDK fornece uma interface de função

JDK fornece muitas funções úteis na interface, provavelmente lista alguns documentação da API específica pode olhar, olhar para o código-fonte no curso de uma mais completa compreensível. Stream APIDe muitas maneiras, estes são utilizados e interface.

interface de função método abstrato explicação
Predicado concluir tipo teste booleano (Tt); Determinar se um determinado parâmetros de tipo cumprir certas restrições
Consumer consumidor anular aceitar (Tt); Para um determinado tipo de parâmetros de operação
Alimentando tipo de fornecedor T get (); Voltar a Resultados
R aplicar (Tt) de função R aplicar (Tt); T tipos de operação, retornar o tipo de resultado R
  • Essas interfaces olhar para o código-fonte para uso entre:
//Strem类中的filter方法:通过某种规则进行过滤。
Stream<T> filter(Predicate<? super T> predicate);
//使用时用Lambda表达式实现接口
List list = Stream.of(1, 3, 4, 5, 10).filter(v -> v > 5).collect(Collectors.toList());
复制代码

Fluxo (Stream)

construção Streams

Como construir um fluxo de uma sequência de valores, matrizes, arquivo? Disponível Stream.of(), Arrays.stream()método

//由值构建
String s = "sunnyDay";
List list = Stream.of(s).collect(Collectors.toList());//使用Stream.of()构建流
//由数组构建
int[] numbers = {2, 0, 2, 0};
int sum = Arrays.stream(numbers).sum();
复制代码

coletor

streamDos elementos para fazer um resumo: gerar lista, Mapa

uso opcional de

ponteiro nulo defeito resolver o problema, o uso específico de referência este artigo


Referência: "Java8 combate", "programação funcional Java8", github.com/winterbe/ja ... github.com/Snailclimb / ...

Acho que você gosta

Origin juejin.im/post/5e7e1aaf51882573c04cbdcb
Recomendado
Clasificación