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 é
Collections
um 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 API
De 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
stream
Dos 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 / ...