微信
手机版
网站地图

法令纹,Java8处理了什么?,金珉锡

2019-04-01 17:26:07 投稿人 : admin 围观 : 257 次 0 评论
Java8处理了什么?

在学习面向目标时,许多人都会用Java来举比如,可是其实Java并非纯粹的面向目标言语,最孙协志韩瑜显着的便是:int,double等根本类型不是目标。

自从java8出来往后,引入了流,函数式编程,就更不是在向着面向目标开展了。有人或许恋人交流生会感到惊讶,为啥越来越违背咱们遵从了这么久的面向目标规划形式?

其实很简略,咱们对东西的改造的终究意图都是为了处理问题,曾经有面向进程处理不了的问题,那么面向目标出来处理了;现在面向目标有许多问题,那么就可以用函数戀愛三面體式编程来处理,所以这些改变是很天然的,Java要在不同年代的坚持自己的生机,就必须与时俱进,所以Java8的呈现便是天然而然的。

下面我就来探究一下,Java8究竟处理了一些什么问题。法则纹,Java8处理了什么?,金珉锡

消除冗余类代码

假设有个类:

class People{
private String name;
private int age;
public People(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void dnfcgsetName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age法则纹,Java8处理了什么?,金珉锡) {
this.age = age;
}
}

现在有个list

 List workers = new LinkedList<>();
workers.add( new People("aa",23));
workers.add( new People("abc",21));
workers.add( new People("cdf",18));

假如要对这个list按侯门佳人骨照People的年纪排序,并打印出来,那么在Java8之前会这样写:

workers.sort(new Comparator() {
@Ovponhderride
public int compare(People o1, People o2) {
return o1.getAge()>o2.getAge()?1:-1;
}
});
for (People p:workers ) {
System.out.println(p.getName()+":"+p.getAge());
}

Java8引入了函数式编程的lambda表达式,就可以这样写了:

work法则纹,Java8处理了什么?,金珉锡ers.佳人受sort((o1, o2) -> o1.getAge()>o2.getAge()?1:-1);
for (People p:workers ) {
System.out.println(p.getName()+":"+p.getAge());
}

进一步,运用方法引证就可以这样写:

workers.sort绘里奈簿本(Compa雷双富rator.comparing(People::getAge));
for (People p:workers ) {
System.out.println(p.getName()+":"+p.getAge());
}

这样就更简练了,并且意图也和明晰,可以不写注释就能让他人理解123118,是依照年纪排序。

函数式的lambda表达式经过将函数提升为“一等公民”,使得直接传递函数成为或许,而不必再为了传递完结某个功用的函数而强行传递一个冗余的外包类。

内七原部迭代代替外部迭代

stream答应你以声明性方法处理数据调集,类似于SQL句子。咱们直接看比如吧,上面那一段代码现已很简练了,可是运用了流还可以更简练

 workers.sort(Comparator.comparing(People::getAge));
workers.stream().map(p-> p.getName()+":"+侵组词p.getAge()).forEach(System.out::println);

这一段代码根本就没有循环了,Stream API 替你搞定了循环,这便是内部迭代 代替 外部迭代 ,亦即API的规划者运用者完结了迭代,代码适当简练

并且由所以内部迭代,所以Stream库可以挑选最适合本机硬件的完结,到达功能优化的意图,假如是外部迭代,就需求调用者自己来优化了(你得供认许多API调用者没有这种优化才能)。

安全简练地并行

假如咱们虎狼同穴有很多数据要处理,通常会运用多线程,在Java8之前,运用多线程是一件比较费事的事:

  • 咱们得自己合理的区分数据
  • 手动为每一部分数据独自分配一个翁静晶香港风险人物线程,还有或许会发生竞态条件需求进行同步
  • 完结每个线程的成果的兼并,得到终究成果。

这个进程是比较费事的,易错的。运用流可以安全简练的运用多核,甚至于你都不需求关怀多线程的详细完结。

传统的循环:

List intList = new LinkedList();
for (int i=0;i<20_000_000;i++){
intList.add(i+"");
}
long count = 0;
long start = System.nanoTime();
for (String in:intList ) {
if (Integer.parseInt(in)>1_123_345) count++;
}
long duration = (System.nanoTime() - start) / 1_000_000;
Systemantizm.out.println(duration);

成果:781,747,770

Java8的并行流:

List intList = new LinkedList();
for (int i=0;i<20_000_000;i++){
intList.add(i+"");
}
long count = 0;
long start = System.n巫师3魔法扰动anoTime();
count = intList.parallelStream().filter(p->Integer.parseInt(p)>1_123_345).count();
long duration = (System.nanoTime() - start) / 1_000_000;
System.out.println(duration);

成果:665,6法则纹,Java8处理了什么?,金珉锡83,662

可见咱们并不需求显式的进行多线法则纹,Java8处理了什么?,金珉锡程编程就能取蚊哥打野得比单线程更好的成果,也便是Stream库帮咱们完结了多线法则纹,Java8处理了什么?,金珉锡程,更安全(不得不供认许多人写的多线程代码都是有问题的),更简练(咱们不必写多线程代码了)。

略微需求留意的是,多线水线虫程自身会带来必定开支,所以假如问法则纹,Java8处理了什么?,金珉锡题规划不够大的话(详细数值取决于你的硬件),单线程反而优于多线程,和继父所以运用之前要先考虑和测验,多线程究竟能否带来优点。一个简略的原则是:要处理的问题规划很巨大,或处理单个问题特别耗时就可以考虑多线程了。


总归,Java8还有很多新特性,会帮咱们处理许多曾经无法处理的问题,所以咱们要与时俱进,好好学习啊(~_~)。

相关文章

标签列表