Java 8函数编程轻松入门(二)Stream的使用
在C#中,微软基于IEnumerable接口,提供许多便捷的扩展方法,便于实际的开发。在Java 1.8中,Collection接口新增了default stream方法。我们可以针对java集合,在stearm()上,可以使用链式函数式编程。
一、外部迭代
- 首先调用iterator方法,产生一个新的Iterator对象,进而控制整个迭代过程。(迭代过程通过显示调用Iterator对象的hasNext和next方法完成迭代)
 
  public static void main(String[] args) {
        Collection<String> list = new ArrayList<>();
        list.add("Android");
        list.add("iPhone");
        list.add("Windows Mobile");
        Iterator<String> itr = list.iterator();
        while (itr.hasNext()) {
            String lang = itr.next();
            System.out.println(lang);
        }
    }
二、内部迭代
是基于stream使用函数式编程的方式在集合上进行复杂的操作。(类似于C#基于IEnumerable的扩展方法,eg:Where()方法)
在函数式编程中,将函数作为参数来传递,传递过程中不会执行函数内部耗时的计算,直到需要这个结果的时候才调用,这样就可以避免一些不必要的计算而改进性能。
在Java的stream()方法中,有惰性求值方法与及早求值方法
返回值为Stream为惰性求职方法。
返回值为空或者别的值为及早求职方法
三、常用的Stream API(相当于IEnumerable的扩展方法表)
示例代码的基础代码
public class Artist {
    private String name;
    private int age;
    public Artist() {
    }
    public Artist(String n, int a) {
        this.name = n;
        this.age = a;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public List<Artist> getArtists() {
        List<Artist> artists = new ArrayList<Artist>();
        artists.add(new Artist("lily", 20));
        artists.add(new Artist("Lucy", 21));
        artists.add(new Artist("jack", 19));
        return artists;
    }
}
1.collect(Collectors.toList())
- 该方法就是将Stream生成一个列表,相当于C#的ToList()
 
  List<String> collected = Stream.of("a", "b").collect(Collectors.toList());
   Set<String> names=new HashSet<>();
    names=artists.stream().map(u->u.getName()).collect(Collectors.toSet());
2.map
- 将一种类型的值转换为另外一种类型的值。
 - 代码:将List 转换成List
 
 List<String> collected = Stream.of("a", "b").collect(Collectors.toList());
  List<Integer> figure = collected.stream().map(s -> {
            Integer i;
            switch (s) {
                case "a":
                    i = 1;
                    break;
                case "b":
                    i = 2;
                    break;
                default:
                    i = -1;
                    break;
            }
            return i;
        }).collect(Collectors.toList());
3.filter(类似于C#的Where)
- 遍历数据并检查其中的元素是否符合给出的表达式的元素
 4.flatMap(类似C# AddRange)
- 将多个Stream连接成一个Stream,这时候不是用新值取代Stream的值,与map有所区别,这是重新生成一个Stream对象取而代之。
 
   List<Integer> a=new ArrayList<>();
        a.add(1);
        a.add(2);
        List<Integer> b=new ArrayList<>();
        b.add(3);
        b.add(4);
        List<Integer> figures=Stream.of(a,b).flatMap(u->u.stream()).collect(Collectors.toList());
        figures.forEach(f->System.out.println(f));
5.max及min
- 求最大值和最小值
 - 此时max及min接受的是Comparator<? super T> comparator
 
 Integer m=figures.stream().max(Comparator.comparing(u->u)).get();
        System.out.println(m);
6.reduce
- 从一组值中生成一个值。比如在一组List将所有元素依次相加
 
 Integer s = figures.stream().reduce((x, y) -> x + y).get();
四、总结
- 1.在编写项目代码时候,多使用内部迭代,避免太多的外部冗余,简化代码
 - 2.将Lambda表达式与Stream方法结合起来,可以完成很多操作
 
Java 8函数编程轻松入门(二)Stream的使用的更多相关文章
- Java 8函数编程轻松入门(三)默认方法详解(default function)
		
default出现的原因 Java 8中对API最大的改变在于集合类,Java在持续演进,但是它一直保持着向后兼容. 在Java 8中为Collection接口增加了stream方法,这意味着所有实现 ...
 - Java 8函数编程轻松入门(五)并行化(parallel)
		
1.并发与并行的区别 并发: 一个时间段内有几个程序都处于已启动到运行完毕之间,且这几个程序都是在同一个处理机上运行.但在任一个时刻点只有一个程序在处理机上运行 并行: 在同一个时刻,多核处理多个任务 ...
 - Java 8函数编程轻松入门(四)方法引用
		
C#中系统提供了许多IEnumerable的扩展方法.同样在Java 8中新引入了Collector类. 1.方法引用 定义: 简而言之:就是一个Lambda表达式.在Java 8中,我们我们会使用L ...
 - Java 8函数编程轻松入门
		
函数接口介绍 在Java1.8中,新增了Lambda表达式.在.net3.5(C# 3.0)在原先的匿名方法基础上演变出了Lambda表达式.学过C# Lambda表达式的同学,对于Java的Lamb ...
 - JAVA之Mybatis基础入门二 -- 新增、更新、删除
		
上一节说了Mybatis的框架搭建和简单查询,这次我们来说一说用Mybatis进行基本的增删改操作: 一. 插入一条数据 1.首先编写USER.XML(表的xml)使用insert元素,元素写在map ...
 - Groovy轻松入门——通过与Java的比较,迅速掌握Groovy (更新于2008.10.18)
		
摘自: http://www.blogjava.net/BlueSUN/archive/2007/03/10/103014.html Groovy轻松入门--通过与Java的比较,迅速掌握Groovy ...
 - Java 8 vs. Scala(二):Stream vs. Collection
		
[编者按]在之前文章中,我们介绍了 Java 8和Scala的Lambda表达式对比.在本文,将进行 Hussachai Puripunpinyo Java 和 Scala 对比三部曲的第二部分,主要 ...
 - Groovy轻松入门——通过与Java的比较,迅速掌握Groovy
		
转自 :Groovy轻松入门——通过与Java的比较,迅速掌握Groovy (更新于2008.10.18) 在前几篇文章中,我已经向大家介绍了Groovy是什么,学习Groovy的重要性等内容,还不了 ...
 - Java 8新特性(二):Stream API
		
本篇文章继续介绍Java 8的另一个新特性--Stream API.新增的Stream API与InputStream和OutputStream是完全不同的概念,Stream API是对Java中集合 ...
 
随机推荐
- 商贸食品车销成功应用PDA抄单 现场开单 打印销售单安卓智能手持POS应用
			
中小超市配送食品,酒水饮料,业务员以往是挨家挨户抄每个超市需要哪些东西,晚上回公司再统计,打到软件里面,开单配货. 选用PDA后,人手一台,直接在超市里面抄好货物,通过网络传输到公司软件上面,加快了工 ...
 - java的动态代理机制详解
			
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
 - win10 下oracle tns通过IP无法访问的解决办法
			
在Oracle安装目录下\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN下找到listener.ora文件,编辑对应项为: LISTE ...
 - 可变参数列表与printf()函数的实现
			
问题 当我们刚开始学习C语言的时候,就接触到printf()函数,可是当时"道行"不深或许不够细心留意,又或者我们理所当然地认为库函数规定这样就是这样,没有发现这个函数与普通的函数 ...
 - [svg 翻译教程]Polyline(折线)polygon(多边形)
			
原文: http://tutorials.jenkov.com/svg/polygon-element.html Polyline 虽然说这个 元素我没用过,但是还是蛮强大的,也翻译下 示例 < ...
 - Windows下使用doxygen阅读和分析C/C++代码
			
Windows下使用doxygen阅读和分析C/C++代码 转自:http://blog.sina.com.cn/s/blog_63d902570100gwk6.html 虽然使用各种IDE或者Sou ...
 - JS转换数字金额为大写
			
function DX(n){ if (!/^(0|[1-9]\d*)(\.\d+)?$/.test(n)) return ""; var unit = "仟佰拾亿仟佰拾 ...
 - hbase
			
http://www.yiibai.com/hbase/hbase_installation.html http://www.linuxidc.com/Linux/2015-03/114669.htm ...
 - django 在字符串[str(list)]中精确查找
			
1.问题描述 1.1表结构 1.2问题 ref_list为id列表的字符串,需要从ref_list中找出包含指定id的数据(eg id=8).如果实用models.objects.filter(ref ...
 - C++风格的回调对象方法. 采用template实现
			
今天看了一篇文章,收藏一下代码.读一读很有激情 #include <iostream> #include <string> #include <vector> us ...