gpt4 book ai didi

java - 用映射替换 switch 语句(针对不同的数据类型)

转载 作者:行者123 更新时间:2023-11-30 03:22:30 25 4
gpt4 key购买 nike

我正在尝试用 map 替换以下 switch 语句。

public ObjGeometry geometry(final Iterable<String> lines) throws IllegalArgumentException {
final List<Vector3f> vertices = Lists.newArrayList();
final List<Vector2f> textures = Lists.newArrayList();
final List<Vector3f> normals = Lists.newArrayList();
final List<Face> faces = Lists.newArrayList();

for (final String line : lines) {
final List<String> lineElements = Arrays.asList(line.split(" "));
final String token = lineElements.get(0);

switch (token) {
case VERTEX:
final Vector3f vertex = createVertex(lineElements);
vertices.add(vertex);
break;
case TEXTURE:
final Vector2f texture = createTexture(lineElements);
textures.add(texture);
break;
case NORMAL:
final Vector3f normal = createNormal(lineElements);
normals.add(normal);
break;
case FACES:
final Face face = createFace(lineElements);
faces.add(face);
break;
}
}
return ObjGeometry.from(vertices, textures, normals, faces);
}

方法#createVertex , #createTexture , #createNormal#createFace将字符串转换为特殊数据类型(Vector2f、Vector3f 或 Face)

我想做的是...构建一张 map Map<TOKEN, Parser> ,因此我可以迭代该映射并为特殊标记调用正确的解析器(顺便说一句。TOKEN 是一个像“v”、“vt”、“vn”或“f”这样的字符串)。

我拥有的是:

  • 抽象类 ExtractVector3f使用方法#vectorFrom(List<String>) - 可以改造List<String>Vector3f
  • 抽象类 ExtractVector2f使用方法#vectorFrom(List<String>) - 可以改造List<String>Vector2f
  • 抽象类 ExtractFace使用方法#faceFrom(List<String>) - 可以改造List<String>Face
  • 接口(interface) LineParser

    public interface LineParser<T> {
    T apply(final List<String> lineElements);
    }
  • 解析顶点的类

    public class ParseVertex extends ExtractVector3f implements LineParser<Vector3f> {
    @Override
    public Vector3f apply(final List<String> lineElements) {
    return vectorFrom(lineElements);
    }
    }
  • 解析法线的类

    public class ParseNormal extends ExtractVector3f implements LineParser<Vector3f> {
    @Override
    public Vector3f apply(final List<String> lineElements) {
    return vectorFrom(lineElements);
    }
    }
  • 解析纹理的类

    public class ParseTexture extends ExtractVector2f implements LineParser<Vector2f> {
    @Override
    public Vector2f apply(final List<String> lineElements) {
    return vectorFrom(lineElements);
    }
    }
  • 以及一个解析人脸的类

    public class ParseFace extends ExtractFaces implements LineParser<Face> {
    @Override
    public Face apply(final List<String> lineElements) {
    return faceFrom(lineElements);
    }
    }

下一步是构建 map ...类似

    Map<String, LineParser> parsers = Maps.newHashMap();
parsers.put("v", new ParseVertex());
parsers.put("vt", new ParseTexture());
parsers.put("vn", new ParseNormal());
parsers.put("f", new ParseFace());

但是现在我遇到了麻烦。此映射中的 LineParser 是原始类型,应避免使用原始类型。

我的问题是:我如何构建一个 map ,其中包含 POJO - 它在通过接口(interface)定义的方法上返回不同的数据类型?

最佳答案

事实上,我不会这样做。即使 map 是个好主意,这样做也会丢失您构建的对象的确切类型。之后你要对他们做什么?您如何知道将它们添加到哪个集合?你不能,除非解析器可以访问所有集合来选择正确的集合。这表明解析器应该知道您的主类或此类的方法。

我只会使用 lambda :

Consumer<List<String>> handleTexture = args -> textures.add(parseTexture(args))
Consumer<List<String>> handleVertice = args -> vertices.add(parseVertice(args))
...
Map<String, Consumer<List<String>> handlers = new HashMap<>();
handlers.put("vf", handleTexture);
handlers.put("v", handleVertice);
...

for (final String line : lines) {
final List<String> lineElements = Arrays.asList(line.split(" "));
final String token = lineElements.get(0);
handlers.get(token).accept(lineElements.sublist(1, lineElements.size()));)
}

如果你想用 Java 7 来做,它在语法上不太好,但原理是一样的。使用 accept 方法创建一个像 Consumer 的接口(interface)(如果您想让该类更适合您的项目,您可以更改所有名称,例如 Parser code> 和 parse,只需为方法保留相同的签名即可):

public class Consumer<T> {
public void accept(T t);
}

然后,在您的代码中

Consumer<List<String>> handleTexture = new Consumer<List<String>>() { 
@Override
public void accept(List<String> args) {
textures.add(parseTexture(args));
}
}

其余的都一样!

关于java - 用映射替换 switch 语句(针对不同的数据类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31012294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com