DataComponentMap.java

net.minecraft.core.component.DataComponentMap

信息

  • 全限定名:net.minecraft.core.component.DataComponentMap
  • 类型:public interface
  • 包:net.minecraft.core.component
  • 源码路径:src/main/java/net/minecraft/core/component/DataComponentMap.java
  • 起始行号:L23
  • 继承:Iterable<TypedDataComponent<?>>, DataComponentGetter
  • 职责:

    TODO

字段/常量

  • EMPTY

    • 类型: DataComponentMap
    • 修饰符: public public public
    • 源码定位: L24
    • 说明:

      TODO

  • CODEC

    • 类型: Codec<DataComponentMap>
    • 修饰符: package-private
    • 源码定位: L40
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.core.component.DataComponentMap.Builder

    • 类型: class
    • 修饰符: public static
    • 源码定位: L125
    • 说明:

      TODO

  • net.minecraft.core.component.DataComponentMap.Builder.SimpleMap

    • 类型: record
    • 修饰符: private
    • 源码定位: L174
    • 说明:

      TODO

构造器

方法

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

static Codec<DataComponentMap> makeCodec(Codec<DataComponentType<?>> componentTypeCodec) @ L42

  • 方法名:makeCodec
  • 源码定位:L42
  • 返回类型:Codec
  • 修饰符:static

参数:

  • componentTypeCodec: Codec<DataComponentType<?>>

说明:

TODO

static Codec<DataComponentMap> makeCodecFromMap(Codec<Map<DataComponentType<?>,Object>> mapCodec) @ L46

  • 方法名:makeCodecFromMap
  • 源码定位:L46
  • 返回类型:Codec
  • 修饰符:static

参数:

  • mapCodec: Codec<Map<DataComponentType<?>,Object>>

说明:

TODO

static DataComponentMap composite(DataComponentMap prototype, DataComponentMap overrides) @ L65

  • 方法名:composite
  • 源码定位:L65
  • 返回类型:DataComponentMap
  • 修饰符:static

参数:

  • prototype: DataComponentMap
  • overrides: DataComponentMap

说明:

TODO

static DataComponentMap.Builder builder() @ L80

  • 方法名:builder
  • 源码定位:L80
  • 返回类型:DataComponentMap.Builder
  • 修饰符:static

参数:

说明:

TODO

Set<DataComponentType<?>> keySet() @ L84

  • 方法名:keySet
  • 源码定位:L84
  • 返回类型:Set<DataComponentType<?>>
  • 修饰符:package-private

参数:

说明:

TODO

default boolean has(DataComponentType<?> type) @ L86

  • 方法名:has
  • 源码定位:L86
  • 返回类型:boolean
  • 修饰符:default

参数:

  • type: DataComponentType<?>

说明:

TODO

default Iterator<TypedDataComponent<?>> iterator() @ L90

  • 方法名:iterator
  • 源码定位:L90
  • 返回类型:Iterator<TypedDataComponent<?>>
  • 修饰符:default

参数:

说明:

TODO

default Stream<TypedDataComponent<?>> stream() @ L95

  • 方法名:stream
  • 源码定位:L95
  • 返回类型:Stream<TypedDataComponent<?>>
  • 修饰符:default

参数:

说明:

TODO

default int size() @ L99

  • 方法名:size
  • 源码定位:L99
  • 返回类型:int
  • 修饰符:default

参数:

说明:

TODO

default boolean isEmpty() @ L103

  • 方法名:isEmpty
  • 源码定位:L103
  • 返回类型:boolean
  • 修饰符:default

参数:

说明:

TODO

default DataComponentMap filter(Predicate<DataComponentType<?>> predicate) @ L107

  • 方法名:filter
  • 源码定位:L107
  • 返回类型:DataComponentMap
  • 修饰符:default

参数:

  • predicate: Predicate<DataComponentType<?>>

说明:

TODO

代码

public interface DataComponentMap extends Iterable<TypedDataComponent<?>>, DataComponentGetter {
    DataComponentMap EMPTY = new DataComponentMap() {
        @Override
        public <T> @Nullable T get(DataComponentType<? extends T> type) {
            return null;
        }
 
        @Override
        public Set<DataComponentType<?>> keySet() {
            return Set.of();
        }
 
        @Override
        public Iterator<TypedDataComponent<?>> iterator() {
            return Collections.emptyIterator();
        }
    };
    Codec<DataComponentMap> CODEC = makeCodecFromMap(DataComponentType.VALUE_MAP_CODEC);
 
    static Codec<DataComponentMap> makeCodec(Codec<DataComponentType<?>> componentTypeCodec) {
        return makeCodecFromMap(Codec.dispatchedMap(componentTypeCodec, DataComponentType::codecOrThrow));
    }
 
    static Codec<DataComponentMap> makeCodecFromMap(Codec<Map<DataComponentType<?>, Object>> mapCodec) {
        return mapCodec.flatComapMap(DataComponentMap.Builder::buildFromMapTrusted, components -> {
            int size = components.size();
            if (size == 0) {
                return DataResult.success(Reference2ObjectMaps.emptyMap());
            } else {
                Reference2ObjectMap<DataComponentType<?>, Object> map = new Reference2ObjectArrayMap<>(size);
 
                for (TypedDataComponent<?> entry : components) {
                    if (!entry.type().isTransient()) {
                        map.put(entry.type(), entry.value());
                    }
                }
 
                return DataResult.success(map);
            }
        });
    }
 
    static DataComponentMap composite(DataComponentMap prototype, DataComponentMap overrides) {
        return new DataComponentMap() {
            @Override
            public <T> @Nullable T get(DataComponentType<? extends T> type) {
                T value = overrides.get(type);
                return value != null ? value : prototype.get(type);
            }
 
            @Override
            public Set<DataComponentType<?>> keySet() {
                return Sets.union(prototype.keySet(), overrides.keySet());
            }
        };
    }
 
    static DataComponentMap.Builder builder() {
        return new DataComponentMap.Builder();
    }
 
    Set<DataComponentType<?>> keySet();
 
    default boolean has(DataComponentType<?> type) {
        return this.get(type) != null;
    }
 
    @Override
    default Iterator<TypedDataComponent<?>> iterator() {
        return Iterators.transform(this.keySet().iterator(), type -> Objects.requireNonNull(this.getTyped((DataComponentType<?>)type)));
    }
 
    default Stream<TypedDataComponent<?>> stream() {
        return StreamSupport.stream(Spliterators.spliterator(this.iterator(), (long)this.size(), 1345), false);
    }
 
    default int size() {
        return this.keySet().size();
    }
 
    default boolean isEmpty() {
        return this.size() == 0;
    }
 
    default DataComponentMap filter(Predicate<DataComponentType<?>> predicate) {
        return new DataComponentMap() {
            {
                Objects.requireNonNull(DataComponentMap.this);
            }
 
            @Override
            public <T> @Nullable T get(DataComponentType<? extends T> type) {
                return predicate.test(type) ? DataComponentMap.this.get(type) : null;
            }
 
            @Override
            public Set<DataComponentType<?>> keySet() {
                return Sets.filter(DataComponentMap.this.keySet(), predicate::test);
            }
        };
    }
 
    public static class Builder {
        private final Reference2ObjectMap<DataComponentType<?>, Object> map = new Reference2ObjectArrayMap<>();
        private Consumer<DataComponentMap> validator = components -> {};
 
        private Builder() {
        }
 
        public <T> DataComponentMap.Builder set(DataComponentType<T> type, @Nullable T value) {
            this.setUnchecked(type, value);
            return this;
        }
 
        <T> void setUnchecked(DataComponentType<T> type, @Nullable Object value) {
            if (value != null) {
                this.map.put(type, value);
            } else {
                this.map.remove(type);
            }
        }
 
        public DataComponentMap.Builder addAll(DataComponentMap map) {
            for (TypedDataComponent<?> entry : map) {
                this.map.put(entry.type(), entry.value());
            }
 
            return this;
        }
 
        public DataComponentMap.Builder addValidator(Consumer<DataComponentMap> newValidator) {
            this.validator = this.validator.andThen(newValidator);
            return this;
        }
 
        public DataComponentMap build() {
            DataComponentMap result = buildFromMapTrusted(this.map);
            this.validator.accept(result);
            return result;
        }
 
        private static DataComponentMap buildFromMapTrusted(Map<DataComponentType<?>, Object> map) {
            if (map.isEmpty()) {
                return DataComponentMap.EMPTY;
            } else {
                return map.size() < 8
                    ? new DataComponentMap.Builder.SimpleMap(new Reference2ObjectArrayMap<>(map))
                    : new DataComponentMap.Builder.SimpleMap(new Reference2ObjectOpenHashMap<>(map));
            }
        }
 
        private record SimpleMap(Reference2ObjectMap<DataComponentType<?>, Object> map) implements DataComponentMap {
            @Override
            public <T> @Nullable T get(DataComponentType<? extends T> type) {
                return (T)this.map.get(type);
            }
 
            @Override
            public boolean has(DataComponentType<?> type) {
                return this.map.containsKey(type);
            }
 
            @Override
            public Set<DataComponentType<?>> keySet() {
                return this.map.keySet();
            }
 
            @Override
            public Iterator<TypedDataComponent<?>> iterator() {
                return Iterators.transform(Reference2ObjectMaps.fastIterator(this.map), TypedDataComponent::fromEntryUnchecked);
            }
 
            @Override
            public int size() {
                return this.map.size();
            }
 
            @Override
            public String toString() {
                return this.map.toString();
            }
        }
    }
}

引用的其他类