DataComponentLookup.java

net.minecraft.core.component.DataComponentLookup

信息

  • 全限定名:net.minecraft.core.component.DataComponentLookup
  • 类型:public class
  • 包:net.minecraft.core.component
  • 源码路径:src/main/java/net/minecraft/core/component/DataComponentLookup.java
  • 起始行号:L15
  • 职责:

    TODO

字段/常量

  • elements

    • 类型: Iterable<?extends Holder<T>>
    • 修饰符: private final
    • 源码定位: L16
    • 说明:

      TODO

  • cache

    • 类型: Map<DataComponentType<?>,DataComponentLookup.ComponentStorage<?,T>>
    • 修饰符: private volatile
    • 源码定位: L17
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.core.component.DataComponentLookup.ComponentStorage
    • 类型: record
    • 修饰符: private
    • 源码定位: L70
    • 说明:

      TODO

构造器

public DataComponentLookup(Iterable<?extends Holder<T>> elements) @ L19

  • 构造器名:DataComponentLookup
  • 源码定位:L19
  • 修饰符:public

参数:

  • elements: Iterable<?extends Holder>

说明:

TODO

方法

下面的方法块按源码顺序生成。

private <C> DataComponentLookup.ComponentStorage<C,T> getFromCache(DataComponentType<C> type) @ L23

  • 方法名:getFromCache
  • 源码定位:L23
  • 返回类型: DataComponentLookup.ComponentStorage<C,T>
  • 修饰符:private

参数:

  • type: DataComponentType

说明:

TODO

private <C> DataComponentLookup.ComponentStorage<C,T> getOrCreateStorage(DataComponentType<C> type) @ L27

  • 方法名:getOrCreateStorage
  • 源码定位:L27
  • 返回类型: DataComponentLookup.ComponentStorage<C,T>
  • 修饰符:private

参数:

  • type: DataComponentType

说明:

TODO

private <C> DataComponentLookup.ComponentStorage<C,T> scanForComponents(DataComponentType<C> type) @ L45

  • 方法名:scanForComponents
  • 源码定位:L45
  • 返回类型: DataComponentLookup.ComponentStorage<C,T>
  • 修饰符:private

参数:

  • type: DataComponentType

说明:

TODO

public <C> Stream<Holder<T>> findMatching(DataComponentType<C> type, Predicate<C> predicate) @ L58

  • 方法名:findMatching
  • 源码定位:L58
  • 返回类型: Stream<Holder>
  • 修饰符:public

参数:

  • type: DataComponentType
  • predicate: Predicate

说明:

TODO

public <C> Collection<Holder<T>> findAll(DataComponentType<C> type, C value) @ L62

  • 方法名:findAll
  • 源码定位:L62
  • 返回类型: Collection<Holder>
  • 修饰符:public

参数:

  • type: DataComponentType
  • value: C

说明:

TODO

public <C> Collection<Holder<T>> findAll(DataComponentType<C> type) @ L66

  • 方法名:findAll
  • 源码定位:L66
  • 返回类型: Collection<Holder>
  • 修饰符:public

参数:

  • type: DataComponentType

说明:

TODO

代码

public class DataComponentLookup<T> {
    private final Iterable<? extends Holder<T>> elements;
    private volatile Map<DataComponentType<?>, DataComponentLookup.ComponentStorage<?, T>> cache = Map.of();
 
    public DataComponentLookup(Iterable<? extends Holder<T>> elements) {
        this.elements = elements;
    }
 
    private <C> DataComponentLookup.@Nullable ComponentStorage<C, T> getFromCache(DataComponentType<C> type) {
        return (DataComponentLookup.ComponentStorage<C, T>)this.cache.get(type);
    }
 
    private <C> DataComponentLookup.ComponentStorage<C, T> getOrCreateStorage(DataComponentType<C> type) {
        DataComponentLookup.ComponentStorage<C, T> existingStorage = this.getFromCache(type);
        if (existingStorage != null) {
            return existingStorage;
        } else {
            DataComponentLookup.ComponentStorage<C, T> newStorage = this.scanForComponents(type);
            synchronized (this) {
                DataComponentLookup.ComponentStorage<C, T> foreignStorage = this.getFromCache(type);
                if (foreignStorage != null) {
                    return foreignStorage;
                } else {
                    this.cache = Util.copyAndPut(this.cache, type, newStorage);
                    return newStorage;
                }
            }
        }
    }
 
    private <C> DataComponentLookup.ComponentStorage<C, T> scanForComponents(DataComponentType<C> type) {
        Builder<C, Holder<T>> results = ImmutableMultimap.builder();
 
        for (Holder<T> element : this.elements) {
            C componentValue = element.components().get(type);
            if (componentValue != null) {
                results.put(componentValue, element);
            }
        }
 
        return new DataComponentLookup.ComponentStorage<>(results.build());
    }
 
    public <C> Stream<Holder<T>> findMatching(DataComponentType<C> type, Predicate<C> predicate) {
        return this.getOrCreateStorage(type).findMatching(predicate);
    }
 
    public <C> Collection<Holder<T>> findAll(DataComponentType<C> type, C value) {
        return this.getOrCreateStorage(type).findAll(value);
    }
 
    public <C> Collection<Holder<T>> findAll(DataComponentType<C> type) {
        return this.getOrCreateStorage(type).valueToComponent.values();
    }
 
    private record ComponentStorage<C, T>(Multimap<C, Holder<T>> valueToComponent) {
        public Collection<Holder<T>> findAll(C value) {
            return this.valueToComponent.get(value);
        }
 
        public Stream<Holder<T>> findMatching(Predicate<C> predicate) {
            return this.valueToComponent.isEmpty()
                ? Stream.empty()
                : this.valueToComponent.entries().stream().filter(e -> predicate.test(e.getKey())).map(Entry::getValue);
        }
    }
}

引用的其他类

  • Holder

    • 引用位置: 参数/字段/返回值
  • DataComponentType

    • 引用位置: 参数/字段
  • Util

    • 引用位置: 方法调用
    • 关联成员: Util.copyAndPut()