Java8 第一章
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java8 第一章相关的知识,希望对你有一定的参考价值。
流处理:
1.是一系列数据项,一次只生成一项
2.一个程序的输出流很可能是另一个程序的输入流
Java8第一个新功能:函数式编程:类名::方法名-->作为参数传递
主旨:把函数(方法和Lambda)作为一等值,执行时在元素之间无互动.
1.方法引用比如筛选一个目录中的所有隐藏的文件.
File类里面有一个isHidden方法 . 我们可以把它当做一个函数,接收一个file , 返回一个布尔值.
public class MethodReferences {
File[] hiddenFiles =new File(".").listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.isHidden();
}
});
}
class MethodReference{
File[] hiddenFiless = new File(".").listFiles(File::isHidden);
}
真cool啊,类加方法就可以了,感受到函数编程的快捷!!!!!!
其实就是将函数(isHidden)传递给listFiles方法 ,
java8体现了更广义的将函数作为值的思想,包括lambda或者匿名函数.
把方法作为一等值来传递的程序,
谓词-->在数学上代表一个类似函数的东西,他接收一个参数值,并返回true或false.
java8会将条件代码作为参数传递进去,这样可以避免filter方法出现重复的代码,
流
外部迭代 : 自己去做迭代的过程,用foreach循环一个个去迭代元素,然后处理元素,
内部迭代 : Stream API
小知识:
计算集群的概念 : 用告诉网络连接起来的多台计算机来高效的处理海量数据.java8 提供了新的编程风格,可以更好的利用这样的计算机,具体怎么更好利用暂时还不清楚.....
这个时候查了一下搜索引擎的实现,比如说google搜索,大概了解了一下实现,知乎地址: https://www.zhihu.com/question/19937854
Collection主要用来存储和访问数据,Stream主要用于对数据的计算.
Stream允许并提倡并行处理一个Stream中的元素,
流中的并行,首先库会将大的流分成几个小的流,以便并行处理,其次流提供的这个几乎免费的并行,在有可变的共享变量情况下,只有在传递给filter之类的库的方法不会互动时才能工作.
行为参数化(接口的多重实现)
应对不断变化的需求 : 一个良好的原则是在编写类似的代码之后,将其抽象化 .反例 : 苹果农民不断变化的需求
比如先定义一个标准的接口
//策略模式实例
public interface ApplePredicate{
boolean test (Apple apple);
}
public class AppleHeavyWeightPredicate implements ApplePredicate{
public boolean test(Apple apple){
return apple.getWeight() > 150;
}
}
public class AppleGreenColorPredicate implements ApplePredicate{
public boolean test(Apple apple){
return "green".equals(apple.getColor);
}
}
//传递代码行为(比如通过传递不同的对象就可以调用不同实现方法,完成对应的操作)
//这个时候农名如果有其他的需求只需要创建一个类实现ApplePredicate就可以了
public static List<Apple> filterApples(List<Apple> inventory,ApplePredicate p){
List<Apple> result = new ArrayList<>();
for (Apple apple : inventory) {
if (p.test(apple)) {
result.add(apple);
}
}
return result;
}
public class AppleRedAndHeacyPredicate implements ApplePredicate{
public boolean test (Apple apple){
return "red".equals(apple.getColor()) && apple.getWeight()>150;
}
}
List<Apple> redAndHeavyApples = filterApples(inventory,new AppleRedAndHeacyPredicate);
策略模式:一个类的行为或者其算法在运行时更改.上面属于策略模式==>忘记了就再看看菜鸟教程写的很清晰
lambda
public interface Predicate<T>{
boolean test(T t);
}
public static <T> List<T> filter(List<T> list,Predicate<T> p){
List<T> result = new ArrayList<>();
for(T e : list){
if (p.test(e)) {
result.add(e);
}
}
return result;
}
?
List<Apple> redApples = filter(inventory,(Apple apple)->"red".equals(appl.getColor()));
?
List<Integer> evenNumbers = filter(numbers,(Integer i) -> i % 2 = 0);
Lambda优点:
匿名==>没有明确的名称,写得少想得多
函数==>函数不属于一个具体的类,Lambda有参数列表,函数主体,返回类型还可能有抛出异常列表
传递==>Lambda表达式可以作为参数传递给方法或存储在变量中
简介==>无需像匿名类那样写很多模板代码
Lambda的使用:
函数式接口:可以直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数接口的实例
具体来说:是函数式接口一个具体实现的实例,例子如下:
<wiz_code_mirror>
public static void main(String[] args) {
Runnable r1 =()-> System.out.println("nihao");
Runnable r2 = new Runnable() {
@Override
public void run() {
System.out.println("wobuhao");
}
};
r1.run();
r2.run();
}
?
输出:
nihao
wobuhao
以上是关于Java8 第一章的主要内容,如果未能解决你的问题,请参考以下文章