Получение ошибки при запуске метода с помощью Generic Type в Java [duplicate]

Поскольку никто еще не упомянул об этом, вот начало решения, использующего Nashorn (часть выполнения JavaScript для Java 8).

Решение

private static final String EXTRACTOR_SCRIPT =
    "var fun = function(raw) { " +
    "var json = JSON.parse(raw); " +
    "return [json.pageInfo.pageName, json.pageInfo.pagePic, json.posts[0].post_id];};";

public void run() throws ScriptException, NoSuchMethodException {
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
    engine.eval(EXTRACTOR_SCRIPT);
    Invocable invocable = (Invocable) engine;
    JSObject result = (JSObject) invocable.invokeFunction("fun", JSON);
    result.values().forEach(e -> System.out.println(e));
}

Сравнение производительности

Я написал контент JSON, содержащий три массива соответственно 20, 20 и 100 элементов. Я хочу получить только 100 элементов из третьего массива. Я использую следующую функцию JavaScript для синтаксического анализа и получения моих записей.

var fun = function(raw) {JSON.parse(raw).entries};

Выполнение вызова в миллион раз с использованием Nashorn занимает 7.5 ~ 7.8 секунд

(JSObject) invocable.invokeFunction("fun", json);

org.json принимает 20 ~ 21 секунд

new JSONObject(JSON).getJSONArray("entries");

Джексон занимает 6,5 ~ 7 секунд

mapper.readValue(JSON, Entries.class).getEntries();

В этом случае Джексон работает лучше, чем Nashorn, который работает намного лучше, чем org.json. Nashorn API сложнее использовать, чем org.json или Jackson's. В зависимости от ваших требований Джексон и Нашорн могут быть жизнеспособными решениями.

26
задан newacct 4 July 2014 в 00:47
поделиться

10 ответов

34
ответ дан Eddie 24 August 2018 в 21:17
поделиться
1
ответ дан Ben Lings 24 August 2018 в 21:17
поделиться

Введите Java 8 и пусть primArray будет идентификатором типа PrimType[], тогда вы можете сделать следующее: BoxedType[] boxedArray = IntStream.range(0, primArray.length).mapToObj(i -> primArray[i]).toArray(BoxedType[] :: new);

1
ответ дан bodmas 24 August 2018 в 21:17
поделиться

Во-первых, я попытался бы избежать массивов столько, сколько вы можете, вместо этого используйте списки.

Нет автобоксинга для массивов, но есть автобоксинг для varargs. Итак, если вы объявите свой метод как (с тем же телом):

public static <T> boolean isMemberOf(T item, T ... set)

, тогда вы можете написать

isMemberOf('a', 'a', 'b', 'c');

Лично я предпочитаю использовать гуаву google, где вы можете написать такие вещи, как

char ch = 'a';
char[] chars = new char[] { 'a', 'b', 'c' };
boolean member = isMemberOf(ch, Chars.asList(chars).toArray(new Character[0]));

. Ваш код был, вероятно, просто примером, но если вы действительно хотели проверить членство, вы можете сделать это следующим образом:

Chars.contains(chars, ch);

or

ImmutableSet.of('a', 'b', 'c').contains('a')
1
ответ дан Jirka 24 August 2018 в 21:17
поделиться

Зачем char[] вставить в поле Character[]? Массивы являются всегда ссылочными типами, поэтому никакого бокса не требуется.

Кроме того, это было бы ужасно дорого - оно включало бы создание нового массива, а затем поочередное боксирование каждого символа. Хлоп!

12
ответ дан Jon Skeet 24 August 2018 в 21:17
поделиться
1
ответ дан Josh Lee 24 August 2018 в 21:17
поделиться

Вы можете использовать отражение, чтобы получить метод, который работает для всех типов массивов, но вы потеряете безопасность типа, поэтому это, вероятно, не то, что вы хотите.

import java.lang.reflect.Array
public static boolean isMemberOfArray(Object item, Object array)
{
    int n = Array.getLength(array)
    for (int i = 0; i < n; i++) {
        if (Array.get(array, i).equals(item)) {
            return true;
        }
    }
    return false;
}
3
ответ дан newacct 24 August 2018 в 21:17
поделиться
0
ответ дан Peter Lawrey 24 August 2018 в 21:17
поделиться
1
ответ дан Tom Hawtin - tackline 24 August 2018 в 21:17
поделиться

Правильно, нет автобоксинга для массивов (что приводит к странности в таких случаях, как int[] ints; ...; Arrays.asList(ints) - asList возвращает список, содержащий один объект, массив!) [/ ​​g0]

Вот простая утилита, массив.

public static Integer[] boxedArray(int[] array) {
    Integer[] result = new Integer[array.length];
    for (int i = 0; i < array.length; i++)
        result[i] = array[i];
    return result;
}

Конечно, для каждого примитивного типа вам понадобится другая версия.

2
ответ дан user 24 August 2018 в 21:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: