多平台统一管理软件接口,如何实现多平台统一管理软件接口
279
2022-09-23
Java泛型模拟scala实现自定义ArrayList方式
目录泛型模拟scala实现自定义ArrayList自定义实现ArrayList代码
泛型模拟scala实现自定义ArrayList
泛型就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),
然后在使用/调用时传入具体的类型
操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
以下实例通过泛型,灵活的实现了类似scala中集合的map,reduce方法,并可以链式编程
Function1:一个入参的泛型接口,例如map(),filter()
//泛型接口
public interface Function1
R call(T t);
}
Function2:两个入参的泛型接口,例如reduce()
//泛型接口
public interface Function2
E call(E elem,E sum);
}
MyList:自定义List
import java.util.ArrayList;
//泛型类
public class MyList
//泛型方法 (只有在public修饰符和返回值之间用了泛型的才是泛型方法,指定后,该方法内可以使用该泛型)
public
MyList
for (E e : this) {
R res = fun.call(e);
myList.add(res);
}
return myList;
}
//这个不是泛型方法,泛型在引用时指定,可以是泛型类中已经定义的,也可以是具体的类
public MyList
MyList
for(E elem : this){
Boolean flag = fun.call(elem);
if(flag){
myList.add(elem);
}
}
return myList;
}
//这个也不是泛型方法
public E reduce(Function2
E sum = null;
boolean isFirst = true;
for (E elem : this) {
if(isFirst){
sum = elem;
isFirst = false;
}else {
sum = fun.call(elem,sum);
}
}
return sum;
}
}
测试:
public class MyTest {
public static void main(String[] args) {
MyList
myList.add("aaaa");
myList.add("bbbb");
myList.add("cccc");
myList.addhttp://("accc");
String res = myList.filter(x -> x.contains("a")).map(x -> x.toUpperCase()).reduce((x, y) -> x + y);
System.out.println(res);
}
}
输出:
自定义实现ArrayList代码
"双十一让你明白,有些东西,打半折你也买不起;就像你喜欢的人,眼光降低一半,还是看不上你“。所以,在JDK1.8中,ArrayList底层是怎么实现的呢?(看源码能理解就行)
/**
* 自定义实现ArrayList
*/
public class TextArrayList
private Object[] elementData;
private int size;
private static final int DEFALT_CAPACITY = 10;
/**
* 无参构造,默认数组大小为10
*/
public TextArrayList() {
elementData = new Object[DEFALT_CAPACITY];
}
/**
* 有参构造,数组大小为传入的值
*/
public TextArrayList(int capacity) {
if (capacity < 0) {
throw new RuntimeException("容器容量不能为负数");
} else if (capacity == 0) {
elementData = new Object[DEFALT_CAPACITY];
} else {
elementData = new Object[capacity];
}
}
/**
* 给数组中添加元素
*
* @param element */
public void add(E element) {
//数组扩容
if (size == elementData.length) {
Object[] newArray = new Object[elementData.length + (elementData.length >> 1)];
System.arraycopy(elementData, 0, newArray, 0, elementData.length);
elementData = newArray;
}
elementData[size++] = element;
}
/**
* 删除元素
* 挨个比较所有元素,获得第一个比较结果为True的,返回
*
* @return
*/
public void remove(E element) {
for (int i = 0; i < size; i++) {
if (element.equals(get(i))) {
//比较操作用到equals方法
System.arraycopy(elementData, i + 1, elementData, i, elementData.length - i - 1);
elementData[size - 1] = null;
size--;
}
}
}
/**
* 删除索引
*
* @return
*/
public void remove(int index) {
int numMoved = elementData.length - index - 1;
if (numMoved > 0) {
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
}
elementData[size - 1] = null;
size--;
}
/**
* 判空
*
* @return
*/
public boolean isEmpty() {
return size == 0 ? true : false;
}
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
//[a,b,c]
stringBuilder.append("[");
for (int i = 0; i < size; i++) {
stringBuilder.append(elementData[i] + ",");
}
stringBuilder.setCharAt(stringBuilder.length() - 1, ']');
etbOmFlzreturn stringBuilder.toString();
}
/**
* 增加get方法
*
* @param index
*/
public E get(int index) {
checkRange(index);
return (E) elementData[index];
}
/**
* 增加set方法
*
* @param index
*/
public void set(E element, int index) {
checkRange(index);
elementData[index] = element;
}
//判断索引合法性
public void checkRange(int index) {
if (index < 0 || index > size - 1) {
http:// throw new RuntimeException("索引不合法:" + index);
}
}
public static void main(String[] args) {
TextArrayList t1 = new TextArrayList(20);
// t1.add("aa");
// t1.add("bb");
for (int i = 0; i < 40; i++) {
t1.add("wang" + i);
}
t1.set("sss", 10);
System.out.println(t1);
System.out.println(t1.get(39));
t1.remove(3);
t1.remove("wang5");
System.out.println(t1);
System.out.println(t1.size);
System.out.println(t1.isEmpty());
}
}
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~