有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

oop通过实时转换在另一个列表上创建对象的java列表

所以,我需要这样:

public class ContainerList implements List<String>{
  private final List<Integer> _list;
  
  public ContainerList(List<Integer> listInt){
    _list = listInt;
  }

  @Override
  public int size() {
    return _list.size();
  }

  @Override
  public String get(int index) {
    // some convertation, it is the main objective
    return Integer.toString(_list.get(index));
  }

  ... // so much overrides!!
}

我需要创建一个新的列表作为另一个实时转换列表的容器。我不能创建普通的ArrayList或这样做

List<String> listStr =
  listInt.stream().map(i -> Integer.toString(i)).collect(Collectors.toList());

因为listInt可以在以后更改,并且这些更改应该以中间方式反映在listStr中。我可以创建一个自定义的通用列表,如ContainerList<;T>;,但并没有那么快。 因此,提示是:“是否存在任何不使用lib的优雅解决方案,或者您能推荐一个好的库?”


共 (2) 个答案

  1. # 1 楼答案

    你可以用番石榴汁

    Returns a list that applies function to each element of fromList. The returned list is a transformed view of fromList; changes to fromList will be reflected in the returned list and vice versa.

    List<String> listStr = Lists.transform(listInt, Object::toString);
    
  2. # 2 楼答案

    可以像这样扩展^{}

    public class TransformedList<S, E> extends AbstractList<E> {
    
        private List<S> sourceElements;
        private Function<S, E> transformer;
    
        public TransformedList(List<S> sourceElements, Function<S, E> transformer) {
            this.sourceElements = sourceElements;
            this.transformer = transformer;
        }
    
        @Override
        public int size() {
            return sourceElements.size();
        }
    
        @Override
        public E get(int index) {
            S sourceElement = sourceElements.get(index);
            return transformer.apply(sourceElement);
        }
    }
    

    然后你可以这样使用

    List<String> numberStrings = Arrays.asList("1", "2", "3");
    List<Integer> intList =  new TransformedList<>(numberStrings, Integer::parseInt);
    

    因为TransformedList只是源列表上的一种视图,所以每当源列表发生变化时,它都会发生变化

    List<String> strings = Arrays.asList("hello");
    List<String> upperCaseList = new TransformedList<>(strings, String::toUpperCase);
    
    System.out.println(upperCaseList.get(0));
    
    strings.set(0, "world");
    
    System.out.printlan(upperCaseList.get(0));
    

    将输出:

    HELLO
    WORLD
    

    一个AbstractList是只读的,当你调用一个像clearremoveaddset这样的变异方法时,它会抛出一个UnsupportedOperationException

    如果要使其可变覆盖:

    • 集合(int,Object)
    • 添加(int,Object)
    • 删除(int)