StringRepresentable.java

net.minecraft.util.StringRepresentable

信息

  • 全限定名:net.minecraft.util.StringRepresentable
  • 类型:public interface
  • 包:net.minecraft.util
  • 源码路径:src/main/java/net/minecraft/util/StringRepresentable.java
  • 起始行号:L18
  • 职责:

    TODO

字段/常量

  • PRE_BUILT_MAP_THRESHOLD
    • 类型: int
    • 修饰符: package-private
    • 源码定位: L19
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.util.StringRepresentable.EnumCodec

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

      TODO

  • net.minecraft.util.StringRepresentable.StringRepresentableCodec

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

      TODO

构造器

方法

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

String getSerializedName() @ L21

  • 方法名:getSerializedName
  • 源码定位:L21
  • 返回类型:String
  • 修饰符:package-private

参数:

说明:

TODO

static <E extends Enum<E> &StringRepresentable> StringRepresentable.EnumCodec<E> fromEnum(Supplier<E[]> values) @ L23

  • 方法名:fromEnum
  • 源码定位:L23
  • 返回类型:<E extends Enum &StringRepresentable> StringRepresentable.EnumCodec
  • 修饰符:static

参数:

  • values: Supplier<E[]>

说明:

TODO

static <E extends Enum<E> &StringRepresentable> StringRepresentable.EnumCodec<E> fromEnumWithMapping(Supplier<E[]> values, Function<String,String> converter) @ L27

  • 方法名:fromEnumWithMapping
  • 源码定位:L27
  • 返回类型:<E extends Enum &StringRepresentable> StringRepresentable.EnumCodec
  • 修饰符:static

参数:

  • values: Supplier<E[]>
  • converter: Function<String,String>

说明:

TODO

static <T extends StringRepresentable> Codec<T> fromValues(Supplier<T[]> values) @ L35

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

参数:

  • values: Supplier<T[]>

说明:

TODO

static <T extends StringRepresentable> Function<String,T> createNameLookup(T[] valueArray) @ L42

  • 方法名:createNameLookup
  • 源码定位:L42
  • 返回类型: Function<String,T>
  • 修饰符:static

参数:

  • valueArray: T[]

说明:

TODO

static <T> Function<String,T> createNameLookup(T[] valueArray, Function<T,String> converter) @ L46

  • 方法名:createNameLookup
  • 源码定位:L46
  • 返回类型: Function<String,T>
  • 修饰符:static

参数:

  • valueArray: T[]
  • converter: Function<T,String>

说明:

TODO

static Keyable keys(StringRepresentable[] values) @ L63

  • 方法名:keys
  • 源码定位:L63
  • 返回类型:Keyable
  • 修饰符:static

参数:

  • values: StringRepresentable[]

说明:

TODO

代码

public interface StringRepresentable {
    int PRE_BUILT_MAP_THRESHOLD = 16;
 
    String getSerializedName();
 
    static <E extends Enum<E> & StringRepresentable> StringRepresentable.EnumCodec<E> fromEnum(Supplier<E[]> values) {
        return fromEnumWithMapping(values, s -> s);
    }
 
    static <E extends Enum<E> & StringRepresentable> StringRepresentable.EnumCodec<E> fromEnumWithMapping(
        Supplier<E[]> values, Function<String, String> converter
    ) {
        E[] valueArray = (E[])values.get();
        Function<String, E> lookupFunction = createNameLookup(valueArray, e -> converter.apply(e.getSerializedName()));
        return new StringRepresentable.EnumCodec<>(valueArray, lookupFunction);
    }
 
    static <T extends StringRepresentable> Codec<T> fromValues(Supplier<T[]> values) {
        T[] valueArray = (T[])values.get();
        Function<String, T> lookupFunction = createNameLookup(valueArray);
        ToIntFunction<T> indexLookup = Util.createIndexLookup(Arrays.asList(valueArray));
        return new StringRepresentable.StringRepresentableCodec<>(valueArray, lookupFunction, indexLookup);
    }
 
    static <T extends StringRepresentable> Function<String, @Nullable T> createNameLookup(T[] valueArray) {
        return createNameLookup(valueArray, StringRepresentable::getSerializedName);
    }
 
    static <T> Function<String, @Nullable T> createNameLookup(T[] valueArray, Function<T, String> converter) {
        if (valueArray.length > 16) {
            Map<String, T> byName = Arrays.<T>stream(valueArray).collect(Collectors.toMap(converter, d -> (T)d));
            return byName::get;
        } else {
            return id -> {
                for (T value : valueArray) {
                    if (converter.apply(value).equals(id)) {
                        return value;
                    }
                }
 
                return null;
            };
        }
    }
 
    static Keyable keys(StringRepresentable[] values) {
        return new Keyable() {
            @Override
            public <T> Stream<T> keys(DynamicOps<T> ops) {
                return Arrays.stream(values).map(StringRepresentable::getSerializedName).map(ops::createString);
            }
        };
    }
 
    public static class EnumCodec<E extends Enum<E> & StringRepresentable> extends StringRepresentable.StringRepresentableCodec<E> {
        private final Function<String, @Nullable E> resolver;
 
        public EnumCodec(E[] valueArray, Function<String, E> nameResolver) {
            super(valueArray, nameResolver, rec$ -> rec$.ordinal());
            this.resolver = nameResolver;
        }
 
        public @Nullable E byName(String name) {
            return this.resolver.apply(name);
        }
 
        public E byName(String name, E _default) {
            return Objects.requireNonNullElse(this.byName(name), _default);
        }
 
        public E byName(String name, Supplier<? extends E> defaultSupplier) {
            return Objects.requireNonNullElseGet(this.byName(name), defaultSupplier);
        }
    }
 
    public static class StringRepresentableCodec<S extends StringRepresentable> implements Codec<S> {
        private final Codec<S> codec;
 
        public StringRepresentableCodec(S[] valueArray, Function<String, @Nullable S> nameResolver, ToIntFunction<S> idResolver) {
            this.codec = ExtraCodecs.orCompressed(
                Codec.stringResolver(StringRepresentable::getSerializedName, nameResolver),
                ExtraCodecs.idResolverCodec(idResolver, i -> i >= 0 && i < valueArray.length ? valueArray[i] : null, -1)
            );
        }
 
        @Override
        public <T> DataResult<Pair<S, T>> decode(DynamicOps<T> ops, T input) {
            return this.codec.decode(ops, input);
        }
 
        public <T> DataResult<T> encode(S input, DynamicOps<T> ops, T prefix) {
            return this.codec.encode(input, ops, prefix);
        }
    }
}

引用的其他类

  • OptionInstance

    • 引用位置: 返回值
  • ExtraCodecs

    • 引用位置: 方法调用
    • 关联成员: ExtraCodecs.idResolverCodec(), ExtraCodecs.orCompressed()
  • Util

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