在学习函数编程的时候,自己手撕一个简单的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);
}
}
有不正确的地方可以私信我