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);
}
}
}引用的其他类
-
- 引用位置:
参数/字段/返回值
- 引用位置:
-
- 引用位置:
参数/字段
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Util.copyAndPut()
- 引用位置: