Использование функции фильтра в kotlin - PullRequest
0 голосов
/ 02 января 2019

Итак, последние пару часов я пытался понять, как работает функция фильтра в kotlin и имеет ли она какую-либо связь с функцией Java. в основном, у меня есть код, написанный на Java, и я бы хотел, чтобы он транскрибировался в kotlin

private List<Order> getFilteredOrders(Courier courier) {
        String[] glovoBoxKeywords = glovoBoxWords.toLowerCase().split(",");
        List<Vehicle> allowedVehicles = Arrays.asList(MOTORCYCLE, ELECTRIC_SCOOTER);

        return orders.stream()
                .filter(order -> {
                    String description = order.getDescription().toLowerCase();
                    if (!courier.getBox()) {
                        return Arrays.stream(glovoBoxKeywords).noneMatch(description::contains);
                    }

                    return true;
                })
                .filter(order -> {
                    Location pickupLocation = order.getPickup();
                    Location deliveryLocation = order.getDelivery();
                    Double distance = calculateDistance(pickupLocation, deliveryLocation);

                    if (distance > longDeliveryDistance) {
                        return allowedVehicles.contains(courier.getVehicle());
                    }

                    return true;
                })
                .collect(Collectors.toList());
    }

Я попробовал это, но я получил это, и буквально застрял :(

 private fun findFilteredOrder(courier: Courier) : List<Order> {
        val glovoBoxKeyWords = glovoBoxWords.toLowerCase().split(",")
        val allowedVehicles = listOf(Vehicle.ELECTRIC_SCOOTER, Vehicle.MOTORCYCLE)

        orderList.filter { order ->
            val description = order.getDescription().toLowerCase()
            if(!courier.getBox()) {

            }
            true
        }.filter {
            val pickupLocation = it.getPickup()
            val deliveryLocation = it.getDelivery()
            val distance = calculateDistance(deliveryLocation, pickupLocation)

            if(distance > longDeliveryDistance) {
                courier.getVehicle() in allowedVehicles
            }
            true
        }
    }

Пожалуйста, это моя первая попытка и что-то делать с kotlin, так что, пожалуйста, идите спокойно, ребята. спасибо, также я был бы благодарен, если бы кто-нибудь мог помочь мне с информативными вещами относительно того, как лучше понять эти функции kotlin. давай, применяй, ассоциируй ... и т. д. СПАСИБО

1 Ответ

0 голосов
/ 02 января 2019

Функция filter в Kotlin Collections имеет тот же принцип, что и другие фреймворки / библиотеки, включая Java Streams . Учитывая предикат (функция от типа коллекции до Boolean), он вернет новую коллекцию с элементами, соответствующими предикату. Вы можете найти более подробную информацию и примеры других функций и операторов в официальной документации и здесь .

Ваш код уже почти готов, я перевожу операцию Java Stream в Kotlin List и переписываю операторы возврата, чтобы удалить лишнюю if

private fun findFilteredOrder(courier: Courier) : List<Order> {
    val glovoBoxKeyWords = glovoBoxWords.toLowerCase().split(",")
    val allowedVehicles = listOf(Vehicle.ELECTRIC_SCOOTER, Vehicle.MOTORCYCLE)

    orderList.filter { order ->
        val description = order.getDescription().toLowerCase()
        courier.getBox() || glovoBoxKeywords.none { it in description }
    }.filter { order ->
        val pickupLocation = order.getPickup()
        val deliveryLocation = order.getDelivery()
        val distance = calculateDistance(deliveryLocation, pickupLocation)

        distance <= longDeliveryDistance || courier.getVehicle() in allowedVehicles
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...