import java.util.HashMap;
import java.util.function.Function;
import java.math.*;
import java.time.*;
class Ideone {
@SuppressWarnings({ "rawtypes", "unchecked" })
private static Object parse
(String argString,
Class param
) { Function
<String,
?> func
= parser.
get(param
); if (func != null)
return func.apply(argString);
if (param.isEnum())
return Enum.valueOf(param, argString);
}
private static HashMap
<Class
<?>, Function
<String,
?>> parser
= new HashMap
<>(); static {
parser.
put(boolean.
class ,
Boolean::parseBoolean
); parser.
put(byte.
class ,
Byte::parseByte
); parser.
put(short.
class ,
Short::parseShort
); parser.
put(int.
class ,
Integer::parseInt
); parser.
put(long.
class ,
Long::parseLong
); parser.
put(double.
class ,
Double::parseDouble
); parser.
put(float.
class ,
Float::parseFloat
); parser.put(LocalDate.class , LocalDate::parse);
parser.put(LocalDateTime.class , LocalDateTime::parse);
parser.put(LocalTime.class , LocalTime::parse);
parser.put(MonthDay.class , MonthDay::parse);
parser.put(OffsetDateTime.class, OffsetDateTime::parse);
parser.put(OffsetTime.class , OffsetTime::parse);
parser.put(Year.class , Year::parse);
parser.put(YearMonth.class , YearMonth::parse);
parser.put(ZonedDateTime.class , ZonedDateTime::parse);
parser.put(ZoneId.class , ZoneId::of);
parser.put(ZoneOffset.class , ZoneOffset::of);
}
public static void main
(String[] args
) { test("true", boolean.class);
test("123" , byte.class);
test("123" , short.class);
test("123" , int.class);
test("123" , long.class);
test("123" , double.class);
test("123" , float.class);
test
("123" ,
Byte.
class); test
("123" ,
Short.
class); test
("123" ,
Long.
class); test
("123" ,
Float.
class); test
("Hello World",
String.
class); // String test("HALF_EVEN" , RoundingMode.class); // enum
test("2016" , Year.class);
test("2016-04" , YearMonth.class);
test("--04-01" , MonthDay.class);
test("2016-04-01" , LocalDate.class);
test("23:18:47" , LocalTime.class);
test("23:18:47-04:00" , OffsetTime.class);
test("2016-04-01T23:18:47" , LocalDateTime.class);
test("2016-04-01T23:18:47-04:00" , OffsetDateTime.class);
test("2016-04-01T23:18:47-04:00[America/New_York]", ZonedDateTime.class);
test("America/New_York" , ZoneId.class);
test("-04:00" , ZoneOffset.class);
test("FRIDAY" , DayOfWeek.class); // enum
test("APRIL" , Month.class); // enum
}
private static void test
(String argString, Class
<?> param
) { Object ret
= parse
(argString, param
); System.
out.
printf("%-21s -> %-19s [%-22s -> %s]%n",
'"' + argString + '"', ret, param.getName(), ret.getClass().getName());
}
}
aW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwppbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOwppbXBvcnQgamF2YS5tYXRoLio7CmltcG9ydCBqYXZhLnRpbWUuKjsKCmNsYXNzIElkZW9uZSB7CgoJQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIiB9KQoJcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IHBhcnNlKFN0cmluZyBhcmdTdHJpbmcsIENsYXNzIHBhcmFtKSB7CgkJRnVuY3Rpb248U3RyaW5nLD8+IGZ1bmMgPSBwYXJzZXIuZ2V0KHBhcmFtKTsKCQlpZiAoZnVuYyAhPSBudWxsKQoJCQlyZXR1cm4gZnVuYy5hcHBseShhcmdTdHJpbmcpOwoJCWlmIChwYXJhbS5pc0VudW0oKSkKCQkJcmV0dXJuIEVudW0udmFsdWVPZihwYXJhbSwgYXJnU3RyaW5nKTsKCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkNhbm5vdCBwYXJzZSBzdHJpbmcgdG8gIiArIHBhcmFtLmdldE5hbWUoKSk7Cgl9CgoJcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxDbGFzczw/PiwgRnVuY3Rpb248U3RyaW5nLD8+PiBwYXJzZXIgPSBuZXcgSGFzaE1hcDw+KCk7CglzdGF0aWMgewoJCXBhcnNlci5wdXQoYm9vbGVhbi5jbGFzcyAgICAgICAsIEJvb2xlYW46OnBhcnNlQm9vbGVhbik7CgkJcGFyc2VyLnB1dChieXRlLmNsYXNzICAgICAgICAgICwgQnl0ZTo6cGFyc2VCeXRlKTsKCQlwYXJzZXIucHV0KHNob3J0LmNsYXNzICAgICAgICAgLCBTaG9ydDo6cGFyc2VTaG9ydCk7CgkJcGFyc2VyLnB1dChpbnQuY2xhc3MgICAgICAgICAgICwgSW50ZWdlcjo6cGFyc2VJbnQpOwoJCXBhcnNlci5wdXQobG9uZy5jbGFzcyAgICAgICAgICAsIExvbmc6OnBhcnNlTG9uZyk7CgkJcGFyc2VyLnB1dChkb3VibGUuY2xhc3MgICAgICAgICwgRG91YmxlOjpwYXJzZURvdWJsZSk7CgkJcGFyc2VyLnB1dChmbG9hdC5jbGFzcyAgICAgICAgICwgRmxvYXQ6OnBhcnNlRmxvYXQpOwoJCXBhcnNlci5wdXQoQm9vbGVhbi5jbGFzcyAgICAgICAsIEJvb2xlYW46OnZhbHVlT2YpOwoJCXBhcnNlci5wdXQoQnl0ZS5jbGFzcyAgICAgICAgICAsIEJ5dGU6OnZhbHVlT2YpOwoJCXBhcnNlci5wdXQoU2hvcnQuY2xhc3MgICAgICAgICAsIFNob3J0Ojp2YWx1ZU9mKTsKCQlwYXJzZXIucHV0KEludGVnZXIuY2xhc3MgICAgICAgLCBJbnRlZ2VyOjp2YWx1ZU9mKTsKCQlwYXJzZXIucHV0KExvbmcuY2xhc3MgICAgICAgICAgLCBMb25nOjp2YWx1ZU9mKTsKCQlwYXJzZXIucHV0KERvdWJsZS5jbGFzcyAgICAgICAgLCBEb3VibGU6OnZhbHVlT2YpOwoJCXBhcnNlci5wdXQoRmxvYXQuY2xhc3MgICAgICAgICAsIEZsb2F0Ojp2YWx1ZU9mKTsKCQlwYXJzZXIucHV0KFN0cmluZy5jbGFzcyAgICAgICAgLCBTdHJpbmc6OnZhbHVlT2YpOwoJCXBhcnNlci5wdXQoQmlnRGVjaW1hbC5jbGFzcyAgICAsIEJpZ0RlY2ltYWw6Om5ldyk7CgkJcGFyc2VyLnB1dChCaWdJbnRlZ2VyLmNsYXNzICAgICwgQmlnSW50ZWdlcjo6bmV3KTsKCQlwYXJzZXIucHV0KExvY2FsRGF0ZS5jbGFzcyAgICAgLCBMb2NhbERhdGU6OnBhcnNlKTsKCQlwYXJzZXIucHV0KExvY2FsRGF0ZVRpbWUuY2xhc3MgLCBMb2NhbERhdGVUaW1lOjpwYXJzZSk7CgkJcGFyc2VyLnB1dChMb2NhbFRpbWUuY2xhc3MgICAgICwgTG9jYWxUaW1lOjpwYXJzZSk7CgkJcGFyc2VyLnB1dChNb250aERheS5jbGFzcyAgICAgICwgTW9udGhEYXk6OnBhcnNlKTsKCQlwYXJzZXIucHV0KE9mZnNldERhdGVUaW1lLmNsYXNzLCBPZmZzZXREYXRlVGltZTo6cGFyc2UpOwoJCXBhcnNlci5wdXQoT2Zmc2V0VGltZS5jbGFzcyAgICAsIE9mZnNldFRpbWU6OnBhcnNlKTsKCQlwYXJzZXIucHV0KFllYXIuY2xhc3MgICAgICAgICAgLCBZZWFyOjpwYXJzZSk7CgkJcGFyc2VyLnB1dChZZWFyTW9udGguY2xhc3MgICAgICwgWWVhck1vbnRoOjpwYXJzZSk7CgkJcGFyc2VyLnB1dChab25lZERhdGVUaW1lLmNsYXNzICwgWm9uZWREYXRlVGltZTo6cGFyc2UpOwoJCXBhcnNlci5wdXQoWm9uZUlkLmNsYXNzICAgICAgICAsIFpvbmVJZDo6b2YpOwoJCXBhcnNlci5wdXQoWm9uZU9mZnNldC5jbGFzcyAgICAsIFpvbmVPZmZzZXQ6Om9mKTsKCX0KCglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgkJdGVzdCgidHJ1ZSIsIGJvb2xlYW4uY2xhc3MpOwoJCXRlc3QoIjEyMyIgLCBieXRlLmNsYXNzKTsKCQl0ZXN0KCIxMjMiICwgc2hvcnQuY2xhc3MpOwoJCXRlc3QoIjEyMyIgLCBpbnQuY2xhc3MpOwoJCXRlc3QoIjEyMyIgLCBsb25nLmNsYXNzKTsKCQl0ZXN0KCIxMjMiICwgZG91YmxlLmNsYXNzKTsKCQl0ZXN0KCIxMjMiICwgZmxvYXQuY2xhc3MpOwoJCXRlc3QoInRydWUiLCBCb29sZWFuLmNsYXNzKTsKCQl0ZXN0KCIxMjMiICwgQnl0ZS5jbGFzcyk7CgkJdGVzdCgiMTIzIiAsIFNob3J0LmNsYXNzKTsKCQl0ZXN0KCIxMjMiICwgSW50ZWdlci5jbGFzcyk7CgkJdGVzdCgiMTIzIiAsIExvbmcuY2xhc3MpOwoJCXRlc3QoIjEyMyIgLCBEb3VibGUuY2xhc3MpOwoJCXRlc3QoIjEyMyIgLCBGbG9hdC5jbGFzcyk7CgkJdGVzdCgiMTIzIiAsIEJpZ0RlY2ltYWwuY2xhc3MpOwoJCXRlc3QoIjEyMyIgLCBCaWdJbnRlZ2VyLmNsYXNzKTsKCQl0ZXN0KCJIZWxsbyBXb3JsZCIsIFN0cmluZy5jbGFzcyk7ICAgICAgIC8vIFN0cmluZwoJCXRlc3QoIkhBTEZfRVZFTiIgICwgUm91bmRpbmdNb2RlLmNsYXNzKTsgLy8gZW51bQoJCXRlc3QoIjIwMTYiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBZZWFyLmNsYXNzKTsKCQl0ZXN0KCIyMDE2LTA0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgWWVhck1vbnRoLmNsYXNzKTsKCQl0ZXN0KCItLTA0LTAxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgTW9udGhEYXkuY2xhc3MpOwoJCXRlc3QoIjIwMTYtMDQtMDEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBMb2NhbERhdGUuY2xhc3MpOwoJCXRlc3QoIjIzOjE4OjQ3IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBMb2NhbFRpbWUuY2xhc3MpOwoJCXRlc3QoIjIzOjE4OjQ3LTA0OjAwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBPZmZzZXRUaW1lLmNsYXNzKTsKCQl0ZXN0KCIyMDE2LTA0LTAxVDIzOjE4OjQ3IiAgICAgICAgICAgICAgICAgICAgICAgICwgTG9jYWxEYXRlVGltZS5jbGFzcyk7CgkJdGVzdCgiMjAxNi0wNC0wMVQyMzoxODo0Ny0wNDowMCIgICAgICAgICAgICAgICAgICAsIE9mZnNldERhdGVUaW1lLmNsYXNzKTsKCQl0ZXN0KCIyMDE2LTA0LTAxVDIzOjE4OjQ3LTA0OjAwW0FtZXJpY2EvTmV3X1lvcmtdIiwgWm9uZWREYXRlVGltZS5jbGFzcyk7CgkJdGVzdCgiQW1lcmljYS9OZXdfWW9yayIgICAgICAgICAgICAgICAgICAgICAgICAgICAsIFpvbmVJZC5jbGFzcyk7CgkJdGVzdCgiLTA0OjAwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIFpvbmVPZmZzZXQuY2xhc3MpOwoJCXRlc3QoIkZSSURBWSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBEYXlPZldlZWsuY2xhc3MpOyAgICAgLy8gZW51bQoJCXRlc3QoIkFQUklMIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBNb250aC5jbGFzcyk7ICAgICAgICAgLy8gZW51bQoJfQoKCXByaXZhdGUgc3RhdGljIHZvaWQgdGVzdChTdHJpbmcgYXJnU3RyaW5nLCBDbGFzczw/PiBwYXJhbSkgewoJCU9iamVjdCByZXQgPSBwYXJzZShhcmdTdHJpbmcsIHBhcmFtKTsKCQlTeXN0ZW0ub3V0LnByaW50ZigiJS0yMXMgLT4gJS0xOXMgICBbJS0yMnMgLT4gJXNdJW4iLAoJCSAgICAgICAgICAgICAgICAgICciJyArIGFyZ1N0cmluZyArICciJywgcmV0LCBwYXJhbS5nZXROYW1lKCksIHJldC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Cgl9Cgp9