泛型的使用

在学习函数编程的时候,自己手撕一个简单的stream流的时候,来复习泛型的使用。

1、泛型方法中要用的泛型数据(参数类型和返回值类型)都要在方法前声明,比如
 

public <U> SimpleStream<U> map(Function<T,U> function)

2、如果泛型类已经声明的泛型类型,泛型方法可以不用声明该泛型类型,比如

这个类已经声明了T    public class SimpleStream <T>
这个方法用到了T和U,他只需要声明U即可,因为T已经在类声明了

public <U> SimpleStream<U> map(Function<T,U> function)

3、泛型类声明的泛型类型和静态类是独立的,也就是说即使泛型类已经声明了,静态类还是要声明,比如

 public static<T> SimpleStream<T> of(Collection<T> collection)


在下面的类中,T类型是跟着所在对象变化的,比如调用了map方法后,再执行forEach方法时,Consumer接口的泛型T其实已经是map方法返回的U类型了,调用map方法之后返回的对象是U类型,即使声明着T类型了。

//实现了stream的几个基础方法
public class SimpleStream <T>{
    public static void main(String[] args) {
        List<Integer> list = List.of(1, 2, 3, 4, 5);
        SimpleStream.of(list)
              .filter(x -> (x & 1) == 1)
                .map(x->x*x)
              //.map(x -> String.valueOf(x))
              .forEach(System.out::println);
    }
    public void forEach(Consumer<T> consumer){
        for (T t : collection) {

            consumer.accept(t);
        }
    }
    public <U> SimpleStream<U> map(Function<T,U> function){
        //将T类型的Stream转化为U类型
        List<U> result = new ArrayList<>();
        for (T t : collection) {
            U u = function.apply(t);
            result.add(u);
        }
        return new SimpleStream<>(result);

    }
    public static<T> SimpleStream<T> of(Collection<T> collection){//泛型方法的返回值声明前面要加上<所有用到的>
        //返回这样一个对象
        return new SimpleStream<T>(collection);
    }

    private Collection<T> collection;
    public SimpleStream(Collection<T> collection){
        this.collection=collection;
    }
    public SimpleStream<T> filter(Predicate<T> predicate){

        //将集合对象过滤,过滤完返回一个新的集合对象
        List<T> result = new ArrayList<>();
        for (T t : collection) {
            if (predicate.test(t)) {
            //满足条件的元素
                result.add(t);
            }
        }
        return new SimpleStream<>(result);
    }

}

有不正确的地方可以私信我

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值