JSONObject and Streams / Lambda - PullRequest
       11

JSONObject and Streams / Lambda

1 голос
/ 15 марта 2020

Я пытаюсь поближе познакомиться с Java лямбда, могу сделать несколько потоков и тому подобное, но еще многому научиться.

Получил этот простой код, используя JSONObject и JSONArray (org. json .Просто с этой точной библиотекой и никакой другой, потому что Gson слишком прост: P) есть ли способ упростить код с помощью java lambda / streams? (Попробовал без удачи)

    JSONArray jsonArray = (JSONArray) jsonObject.get("someData");

    Iterator<JSONObject> iterator = jsonArray.iterator();

    double total = 0;
    while(iterator.hasNext()) {
        JSONObject iteratedJson = iterator.next();
        // iteratedJson.get("ip") = "101.99.99.101" example values
        String ip = (String) iteratedJson.get("ip");
        // Need only first octet
        ip = ip.substring(0, ip.indexOf("."));

        if (Integer.valueOf(ip) >= 1 && Integer.valueOf(ip) <= 100) {
            // Another object inside the array object
            JSONObject locationObject = (JSONObject) iteratedJson.get("location");
            // Id is int but JSONObject don't let me parse int...
            long locationId = (Long) locationObject.get("id");

            if (locationId == 8) {
                // iteratedJson.get("amount") = "$1,999.10" example values
                Number number = NumberFormat.getCurrencyInstance(Locale.US).parse((String)iteratedJson.get("amount"));

                // Don't need a lot of precission
                total = total + number.doubleValue();
            }
        }
    }

1 Ответ

3 голосов
/ 15 марта 2020

Вы можете сделать так:

в первую очередь для извлечения данных из JsonObject. Я создал класс. этот класс принимает JosonObject в качестве аргумента и извлекает его значения, как показано ниже.

class ExtractData {
  Integer ip;
  long id;
  double amount;

  public ExtractData(JSONObject jsonObject) {
    this.ip = Integer.valueOf(jsonObject.get("ip").toString().split("\\.")[0]);
    this.id = Long.parseLong(((JSONObject) jsonObject.get("location")).get("id").toString());
    try {
         this.amount = NumberFormat.getCurrencyInstance(Locale.US)
                            .parse((String) jsonObject.get("amount")).doubleValue();
    } catch (ParseException e) {
           this.amount = 0d;
    }
  }

   // getter&setter
} 

, затем вы можете использовать потоковый API для вычисления суммы свойства количества.

jsonArray.stream()
         .map(obj -> new ExtractData((JSONObject) obj))
         .filter(predicate)
         .mapToDouble(value -> ((ExtractData) value).getAmount())
         .sum();

для упрощения операции извлечения фильтра.

Predicate<ExtractData> predicate = extractData -> 
           extractData.getIp()>=1 && extractData.getIp()<=100 && extractData.getId() == 8;
...