How to convert from String to a primitive type or standard java Wrapper types

前端 未结 6 877
不知归路
不知归路 2020-12-14 18:16

I have a java.lang.reflect.InvocationHandler and I need to implement the method invoke()

I have a value of type java.lang.String from my el

6条回答
  •  余生分开走
    2020-12-14 18:37

    in jdk8, you could now do something like so O(1) lookup time with no if statements...

    A better version now that handles nulls correct is here

    https://github.com/deanhiller/webpieces/blob/master/webserver/http-router/src/main/java/org/webpieces/router/impl/params/ObjectTranslator.java

    private Map, Function> classToUnmarshaller = new HashMap<>();
    private Map, Function> classToMarshaller = new HashMap<>();
    
    public ObjectTranslator() {
        classToUnmarshaller.put(Boolean.class, s -> s == null ? null : Boolean.parseBoolean(s));
        classToUnmarshaller.put(Boolean.TYPE, s -> Boolean.parseBoolean(s));
        classToUnmarshaller.put(Byte.class, s -> s == null ? null : Byte.parseByte(s));
        classToUnmarshaller.put(Byte.TYPE, s -> Byte.parseByte(s));
        classToUnmarshaller.put(Short.class, s -> s == null ? null : Short.parseShort(s));
        classToUnmarshaller.put(Short.TYPE, s -> Short.parseShort(s));
        classToUnmarshaller.put(Integer.class, s -> s == null ? null : Integer.parseInt(s));
        classToUnmarshaller.put(Integer.TYPE, s -> Integer.parseInt(s));
        classToUnmarshaller.put(Long.class, s -> s == null ? null : Long.parseLong(s));
        classToUnmarshaller.put(Long.TYPE, s -> Long.parseLong(s));
        classToUnmarshaller.put(Float.class, s -> s == null ? null : Float.parseFloat(s));
        classToUnmarshaller.put(Float.TYPE, s -> Float.parseFloat(s));
        classToUnmarshaller.put(Double.class, s -> s == null ? null : Double.parseDouble(s));
        classToUnmarshaller.put(Double.TYPE, s -> Double.parseDouble(s));
        classToUnmarshaller.put(String.class, s -> s);
    
        classToMarshaller.put(Boolean.class, s -> s == null ? null : s.toString());
        classToMarshaller.put(Boolean.TYPE, s -> s.toString());
        classToMarshaller.put(Byte.class, s -> s == null ? null : s.toString());
        classToMarshaller.put(Byte.TYPE, s -> s.toString());
        classToMarshaller.put(Short.class, s -> s == null ? null : s.toString());
        classToMarshaller.put(Short.TYPE, s -> s.toString());
        classToMarshaller.put(Integer.class, s -> s == null ? null : s.toString());
        classToMarshaller.put(Integer.TYPE, s -> s.toString());
        classToMarshaller.put(Long.class, s -> s == null ? null : s.toString());
        classToMarshaller.put(Long.TYPE, s -> s.toString());
        classToMarshaller.put(Float.class, s -> s == null ? null : s.toString());
        classToMarshaller.put(Float.TYPE, s -> s.toString());
        classToMarshaller.put(Double.class, s -> s == null ? null : s.toString());
        classToMarshaller.put(Double.TYPE, s -> s.toString());
        classToMarshaller.put(String.class, s -> s == null ? null : s.toString());
    }
    
    public Function getUnmarshaller(Class paramTypeToCreate) {
        return classToUnmarshaller.get(paramTypeToCreate);
    }
    
    public Function getMarshaller(Class type) {
        return classToMarshaller.get(type);
    }
    

    such that you can then call

    primitiveTranslator.getConverter(Integer.TYPE).apply(stringToConvert);
    

提交回复
热议问题