刚开始用java8的时候,很多都是替代for循环,因为java8推出了强大的流stream,关于流的用法很多,百度一下就可以搜到语法之类,所以这里我只想举一些简单替代for的例子,含义那些就自己去查吧。 
好了,让我们开始吧。男人类有很多卡类,先初始化一些数据。

List<Man> mans = new ArrayList<>();
        mans.add(new Man(\"001\",\"张三\",Arrays.asList(new Card(\"工商银行\",\"9558800001\"),new Card(\"工商银行\",\"9558800002\"),new Card(\"建设银行\",\"6227001234\"))));
        mans.add(new Man(\"002\",\"李四\",Arrays.asList(new Card(\"招商银行\",\"6225800002\"),new Card(\"建设银行\",\"6227035248\"))));
        mans.add(new Man(\"003\",\"王五\",Arrays.asList(new Card(\"建设银行\",\"6227056547\"),new Card(\"中国银行\",\"6013832547\"),new Card(\"民生银行\",\"4074058542\"))));
        mans.add(new Man(\"004\",\"赵六\",Arrays.asList(new Card(\"工商银行\",\"9558832458\"),new Card(\"工商银行\",\"9558832547\"),new Card(\"建设银行\",\"6227032578\"))));
        mans.add(new Man(\"005\",\"孙七\",Arrays.asList(new Card(\"中国银行\",\"6013825847\"),new Card(\"农业银行\",\"6228836547\"),new Card(\"招商银行\",\"6225014582\"))));
        mans.add(new Man(\"006\",\"张三\",Arrays.asList(new Card(\"工商银行\",\"9558832587\"),new Card(\"交通银行\",\"6222814578\"),new Card(\"工商银行\",\"9558865427\"))));

1,查找张三的男人,for是这样的,

public List<Man> getByName(List<Man> mans){
        List<Man> temp = new ArrayList<>();
        for(Man man : mans){
            if(\"张三\".equals(man.getName())){
                temp.add(man);
            }
        }
        return temp;
    }

改进后为:

public List<Man> getByName8(List<Man> mans) {
        return mans.stream().filter(m -> \"张三\".equals(m.getName())).collect(Collectors.toList());
    }

这里的集合相当与数据库的表,而filter相当于数据库的where。 
2,继续,查找id为007的男人,id唯一,for是这样的

public Man getById(List<Man> mans) {
        for (Man man : mans) {
            if (\"007\".equals(man.getId())) {
                return man;
            }
        }
        return null;
    }

改进后为:

public Man getById8(List<Man> mans) {
        return mans.stream().filter(m -> \"oo7\".equals(m.getId())).findFirst().orElse(null);
    }

3,继续,获取名字叫张三(因有同名)的所有银行卡,这里不讨论实际业务意义,只讲技术,哈哈,用for是这样的。

public List<Card> getAllCardByName(List<Man> mans) {
        List<Card> cards = new ArrayList<>();
        for (Man man : mans) {
            if (\"张三\".equals(man.getName())) {
                cards.addAll(man.getCards());
            }
        }
        return cards;
    }

改进后是这样的

public List<Card> getAllCardByName8(List<Man> mans) {
        return mans.stream().filter(m -> \"张三\".equals(m.getName())).flatMap(m -> m.getCards().stream())
                .collect(Collectors.toList());
    }

4,继续,在3的条件上加个工商银行条件,for

public List<Card> getSomeCardByName(List<Man> mans) {
        List<Card> cards = new ArrayList<>();
        for (Man man : mans) {
            if (\"张三\".equals(man.getName())) {
                for (Card card : man.getCards()) {
                    if (\"工商银行\".equals(card.getName())) {
                        cards.add(card);
                    }
                }
            }
        }
        return cards;
    }
改进后是这样的

public List<Card> getSomeCardByName8(List<Man> mans) {
        return mans.stream().filter(m -> \"张三\".equals(m.getName())).flatMap(m -> m.getCards().stream())
                .filter(c -> \"工商银行\".equals(c.getName())).collect(Collectors.toList());
    }

5,把张三的名字修改为新张三,for,注意会改变源数据

public List<Man> changeName(List<Man> mans) {
        for (Man man : mans) {
            if (\"张三\".equals(man.getName())) {
                man.setName(\"新张三\");
            }
        }
        return mans;
    }

改进:

public List<Man> changeName8(List<Man> mans) {
        return mans.stream().peek(m -> {
            if (\"张三\".equals(m.getName()))
                m.setName(\"新张三\");
        }).collect(Collectors.toList());
    }
 

收藏 打印