java lambda 多核_初探Lambda表达式/Java多核编程【1】从集合到流

初探Lambda表达式/Java多核编程【1】从集合到流

从集合到流

接上一小节,本小节将着手使用 "流" 这一概念进行 "迭代" 操作。

首先何为 "迭代"。其意为对某一对象进行某种操作,并把结果作为下一次操作的输入,如此往复进行,直至得到或逼近预期结果。

现在我们用代码来具体表示对某一集合进行迭代操作,我们希望定义一个 Contact 类来表示联系人,并将 ContactList 中所有 String 类型的联系人姓名全部包装进 Contact 类中:Listcontacts=newArrayList<>();

contactList.forEach(newConsumer(){

@Override

publicvoidaccept(Strings){

Contactcontact=newContact();

contact.setName(s);

contacts.add(contact);

}

});

接下来我们希望筛选出所有还能打通的联系人,将其放入一个有效联系人集合:ListvalidContacts=newArrayList<>();

contacts.forEach(newConsumer(){

@Override

publicvoidaccept(Contactc){

if(c.call())

validContacts.add(c);

}

});

System.out.println(validContacts.size());

可以看出,第一次操作我们将 String 类型的数据转换为 Contact,第二次则对每一个 Contact 调用call()方法,筛选出返回结果为 true的联系人并将其收集进另一个集合,最后我们统计出还能打通的联系人数目。

在此过程中,操作行为完全封闭在各个集合内部,无需引入任何外部变量。

从处理开始、进行到结束,对象在操作间如同一个有序序列在移动,这就是流的特征,即 "移动中的数据"。

真正的流与集合大相径庭,其只表示一种 "可选的有序值序列",而 "无需为这些值提供任何存储",这就是为何 Stream在 Java8-API 中被定义为接口而非一种类。publicinterfaceStreamextendsBaseStream>{}

Stream为对象的流,而 DoubleStream、LongStream以及 IntStream则为 double、long 以及 int 这三种基本类型的流。

现在我们再将第一次从 String 到 Contact 的映射用流的方式来重写:StreamcontactStream=contactList.stream().map(s->newContact().setName(s));

stream()从源中取得管道,表示流的开始。

map()接收管道中的流并对其进行某种变换,在本例中,我们将管道中的 String 映射成为 Contact 类,自此,String 管道成为 Contact 管道。

我们可以将上一段代码拆分为:StreamstringStream=contactList.stream();

StreamcontactStream1=stringStream.map(s->newContact().setName(s));

在基本搞清了流操作之后,我们现在一气呵成,直接使用流得到最终结果:longvalidContactCounter=

contactList.stream()

.map(s->newContact().setName(s))

.filter(c->c.call())

.count();

可以看出,我们对流能够进行丰富的操作,过滤、计数、查找等等,在此不表。

小结

使用流的方式处理数据能够精简代码,同时突出了所要进行的操作,当然乍看起来有些难懂。

既然牺牲了些许可读性,但是作为交换条件,我们在这种顺序执行的流操作中,获得了两倍于相应的循环版本的性能。

同样,并行执行流操作对于大型数据集将产生非凡的效果。

本小节相关代码:

(Contact.java)importjava.util.Random;

publicclassContact{

privateStringname;

privatelongnumber;

privateRandomrandom;

publicContact(){

random=newRandom();

}

publicStringgetName(){

returnname;

}

publicContactsetName(Stringname){

this.name=name;

returnthis;

}

publiclonggetNumber(){

returnnumber;

}

publicContactsetNumber(longnumber){

this.number=number;

returnthis;

}

publicbooleancall(){

returnrandom.nextBoolean();

}

}

(运行用)Listcontacts=newArrayList<>();

contactList.forEach(newConsumer(){

@Override

publicvoidaccept(Strings){

Contactcontact=newContact();

contact.setName(s);

contacts.add(contact);

}

});

ListvalidContacts=newArrayList<>();

contacts.forEach(newConsumer(){

@Override

publicvoidaccept(Contactcontact){

if(contact.call())

validContacts.add(contact);

}

});

System.out.println(validContacts.size());

//--- Stream is coming ---//

StreamcontactStream=contactList.stream().map(s->newContact().setName(s));

//--- Break this code ---//

StreamstringStream=contactList.stream();

StreamcontactStream1=stringStream.map(s->newContact().setName(s));

//--- All in one ---//

longvalidContactCounter=

contactList.stream()

.map(s->newContact().setName(s))

.filter(c->c.call())

.count();

System.out.println(validContactCounter);

以及运行结果:3

3

来源:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值