java8 -->streams

stream和io流没有什么关系。
它是操作管道获取source(从各种数据中获得比如array,list....)并处理数据

public class study1 {

private static class myRand implements Supplier{
    private int index=0;
    private Random random=new Random();
    
    @Override
    public Object get() {
        int num=random.nextInt(100);
        return String.valueOf(num);
    }
}




static class Person{
    private String name;
    public Person() {
        
    }
    public Person(String name) {
        this.name=name;
    }
    public void setName(String name) {
        this.name=name;
    }
    public String getName() {
        return name;
    }
    public int getage() {
        return Integer.parseInt(name);
    }
}
public static void main(String[] args) throws FileNotFoundException {
    //流的构造
    Stream stream=Stream.of("a","b");
    String [] arr=new String[] {"a","b"};
    stream=Stream.of(arr);
    stream=Arrays.stream(arr);
    List<String> list=Arrays.asList(arr);
    stream=list.stream();
    
    //数值流
    IntStream.of(new int[] {1,2,3,4,5}).forEach(System.out::println);
    IntStream.range(1,3).forEach(System.out::println);                      //1
    IntStream.rangeClosed(1, 3).forEach(System.out::println);               //2   1.2的区别在于,2是闭区间,所以会输出1.2.3,而2是开区间智慧输出1.2

    //流转化为其他类型
    Object[] arr2=stream.toArray(String[] :: new);
    Stream stream2=Stream.of(arr2);
    
    //List<String> list2=(List<String>) stream.collect(Collectors.toList());
    Stack stack=(Stack) stream2.collect(Collectors.toCollection(Stack::new));       //每个资源只能被利用一次
    //String str = stream2.collect(Collectors.joining()).toString();
    //Set set1 = (Set) stream2.collect(Collectors.toSet());
    
    
    //用map把list元素全变为大写
    List<String> wordList=new ArrayList<>();
    wordList.add("dasda");
    wordList.add(1,"aaa");
    List<String> list3=wordList.stream()
            .map(String::toUpperCase)
            .collect(Collectors.toList());  
    list3.stream().forEach(System.out::println);
    
    
    //一对多的map
    Stream<List<Integer>> stream3=Stream.of(
            Arrays.asList(1,2,3),
            Arrays.asList(4,5,6)
            );
    stream3.flatMap((chilelist)->chilelist.stream())                //如果使用map那么这一步得到的是两个stream,而flatMap会将其都合并成一个stream,那么现在的stream中全部都是数字
            .forEach(System.out::println);

    //过滤器filter
    Integer[] num= {1,2,3,4,5,6,7,8};
    Integer[] newnum=Stream.of(num)
            .filter(n -> n%5 == 0)
            .toArray(Integer[] :: new);
    Stream.of(newnum).forEach(System.out::println);
    
    //lines()只是针对bufferReader的,也就是针对文件的
    File file=new File("/home/yhw/eclipse-workspace/TheHolleWord/src/streams/words.txt");
    InputStream in=new FileInputStream(file);
    InputStreamReader reader=new InputStreamReader(in);
    BufferedReader b=new BufferedReader(reader);
    List<String> myList=b.lines()
        .flatMap(n -> Stream.of(n.split(" ")))                                      //这里的单位是行,因为没办法用StringTokenizer,所以只能对每一行分流
        .filter(n -> n.length()>0)
        .collect(Collectors.toList());
    myList.stream()
    .peek(e->System.out.println(e))                                                 //peek和forEach的区别是,peak操作不会被消费
    .forEach(System.out::println);
    
    String nu=null;
    Optional.ofNullable(nu).ifPresent(System.out::println);

    
    //reduce合并函数
    String concat = Stream.of("A","B","C").reduce("",String::concat);
    System.out.println(concat);
    double min=Stream.of(-1.5,-2.0,-3.0).reduce(Double.MIN_VALUE,Double::min);
    System.out.println(min);
    Integer sum=Stream.of(1,2,3,4,5,6).reduce(Integer::sum).get();
    System.out.println(sum);
    
    
    
    //limit指定只要前几个数,skip去掉前几个数,sorted进行排序
    List<Integer> list2=Arrays.asList(1,2,3,4,43,64,63,636,4,63,3,11);
    list2.stream()                                                      //list只能用list.stream建立流
    .limit(8)
    .skip(2)
    .sorted((a1,b1)-> b1.compareTo(a1))                                 //sort可以自定义
    .forEach(System.out::println);

    
    //distinct除去重复项,Match可以匹配到是否有该元素,其类还有NoneMatch,allMatch返回布尔值
    BufferedReader buf=new BufferedReader(new FileReader("/home/yhw/eclipse-workspace/TheHolleWord/src/streams/words.txt"));
    int longlen=buf.lines()
            .mapToInt(ak -> ak.length())                                //直接处理整行处理
            .max()
            .getAsInt();
    System.out.println(longlen);
        
    BufferedReader buff=new BufferedReader(new FileReader("/home/yhw/eclipse-workspace/TheHolleWord/src/streams/words.txt"));
    boolean n=buff.lines()
        .flatMap((mp) -> Stream.of(mp.split(" ")))                          //flatMap是将一行的单词切分后,变为了单词流,相当于一行变多个
        .filter(fi -> fi.length()>0)                                    
        .map(String::toLowerCase)
        .peek(wo -> System.out.println(wo))
        .distinct()
        .anyMatch(word -> word.equals("ages"));                             
    System.out.println(n);
            
    //自定义流:模拟生成随机数,一般用于自定义的数据类型
    List<Person> list4=(List<Person>) Stream.generate(new myRand()).
        limit(100).
        peek(p->new Person(String.valueOf(p)))
        .collect(Collectors.toList());
    
    
    //conllect归组
     Map<String, List<Person>> map=(Map<String, List<Person>>) Stream.generate(new myRand2()).
            limit(100).
            collect(Collectors.groupingBy(Person::getName));
            
    Iterator iterator=map.entrySet().iterator();                        //先转化为迭代器,那么返回的每个对象,就是一个key(String)对应一个value(List)
    while(iterator.hasNext()) {
        Map.Entry<String,List<Person>> pEntry=(Entry<String, List<Person>>) iterator.next();
        System.out.println(pEntry.getKey()+":"+pEntry.getValue().get(0));
    }
    
    List<Person> list5=new ArrayList<>();
    list5.add(new myRand2().get());
    list5.add(new myRand2().get());
    list5.add(new myRand2().get());
    list5.add(new myRand2().get());
    list5.add(new myRand2().get());
    
    /*Map<Boolean, List<Person>> children = Stream.generate(new myRand()).                                          //这个p就是object而不是Person
             limit(100).
             collect(Collectors.partitioningBy(p -> p.getAge() < 18));*/
    
    Map<Boolean,List<Person>>maps=list5.stream().collect(Collectors.partitioningBy(p->p.getage()<18));          //只有当有明确数据类型时,p才是确定的数据类型
    System.out.println(maps.get(true).size());
}

@SuppressWarnings("rawtypes")
private static class myRand2 implements Supplier{
    private int index=0;
    private Random random=new Random();
    
    @Override
    public Person get() {
        int num=random.nextInt(100);
        return new Person(String.valueOf(num));
    }
}

}
https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,647评论 18 139
  • 定义 A sequence of elements supporting sequential and paral...
    骊骅阅读 387评论 0 0
  • 2018年2月18号,相博超妈妈 好开心,今天要回娘家了。 今年妹妹是结婚第一年回来拜年,是新女婿,大妈让...
    一年级四班相博超妈妈阅读 323评论 0 1
  • (一) 寒夜漫漫万迹箫,延陵处处江水杳; 此生惘然东风谢,旧事难抿覆泥沼。 城南今年飞雪早,一剪寒梅映墙角; 蛛廊...
    东篱花飞阅读 308评论 4 15
  • 最近接触到了两个概念:直接融资和间接融资。我并没有认真研究这两个概念,我直觉的理解是:直接融资就是需要钱的企业,找...
    Lcww阅读 345评论 0 0