初探java8函数式编程

Lambda

Lambda引用的是值,不是变量,所以,lambda中引用变量,必须是final变量或者既成事实上的final变量

Stream

collect(toList())

collect(toList()) 方法由 Stream 里的值生成一个列表, 是一个及早求值操作

List<String> collected = Stream.of("a", "b", "c").collect(Collectors.toList());

map

将流中一种类型的值转变为另一种类型的值得流用map

//for  
List<String> list =new ArrayList<>() ;
 for (String string:asList("a", "ab", "hello")){
      list.add(string.toUpperCase());
 }

//lambda
List<String> collected = Stream.of("a", "ab", "hello").map(string -> string.toUpperCase()) .collect(toList())

filter

遍历数据并检查其中的元素时用filter

//for
        List<String> list =new ArrayList<>() ;
        for (String string:asList("a", "ab", "hello")){
            if (string.startsWith("a")){
                list.add(string);
            }
        }

//lambda
List<String> a = Stream.of("a", "ab", "hello").filter(string -> string.startsWith("a")).collect(toList());

flatmap

flatMap 方法可用 Stream 替换值, 然后将多个 Stream 连接成一个 Stream

List<Integer> collect1 = Stream.of(asList(1, 2, 3), asList(4, 5, 6))

        .flatMap(numbers -> numbers.stream()).collect(Collectors.toList());

max和min

Stream 上常用的操作之一是求最大值和最小值

Integer min = Stream.of(1, 2, 3)

        .min(Comparator.comparing(Integer::intValue)).get();

Integer max = Stream.of(1, 2, 3)

        .max(Comparator.comparing(s -> s)).get();

Reduce

reduce 操作可以实现从一组值中生成一个值。 在上述例子中用到的 count、 min 和 max 方法, 因为常用而被纳入标准库中。 事实上, 这些方法都是 reduce 操作。reduce 操作可以实现从一组值中生成一个值。 在上述例子中用到的 count、 min 和 max 方法, 因为常用而被纳入标准库中。 事实上, 这些方法都是 reduce 操作。

使用reduce求和

int acc=0;
for (int ele:asList(1,2,3)){
    acc+=ele;
}
//等价于
Integer reduce = Stream.of(1, 2, 3).reduce(0, (acc, ele) -> acc + ele);

组合练习

 flatmap也用于将一个list转为另一个list,如重构以下代码

public Set<String> findLongTracks (List < Album > albums) {
    Set<String> trackNames = new HashSet<>();
    for (Album album : albums) {
        for (Track track : album.getTrackList()) { if (track.getLength() > 60) {
                String name = track.getName();
                trackNames.add(name);
            }

        }
    }
    return trackNames;
}

重构后的代码


public Set<String> findLongTracks (List < Album > albums) {
    return albums.Stream()
    .flatmap(album->album.getTrackList())
    .filter(track->track.getLength>0)
    .map(track->track.getName())
    .collect(toSet())
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值