Соберите в список, а затем передайте его в лямбда или потребительскую java 8

Здесь является одним из хороших источников this в JavaScript.

Вот сводка:

  • global this In a браузер, в глобальной области, this является объектом window
    
    

    Если вы используете use strict;, в котором case this будет undefined

    
    

    Если вы вызываете функцию с new, this будет новым контекстом, он не будет ссылаться на глобальный this.

    
    
    • прототип этого

    Функции, которые вы создаете, становятся объектами функции. Они автоматически получают специальное свойство prototype, которое вы можете присвоить значениям. Когда вы создаете экземпляр, вызывая функцию с помощью new, вы получаете доступ к значениям, присвоенным свойству prototype. Вы получаете доступ к этим значениям с помощью this.

    function Thing() {
      console.log(this.foo);
    }
    
    Thing.prototype.foo = "bar";
    
    var thing = new Thing(); //logs "bar"
    console.log(thing.foo);  //logs "bar"
    

    Обычно ошибка заключается в назначении массивов или объектов на prototype. Если вы хотите, чтобы экземпляры каждого имели свои собственные массивы, создайте их в функции, а не в прототипе.

    function Thing() {
        this.things = [];
    }
    
    var thing1 = new Thing();
    var thing2 = new Thing();
    thing1.things.push("foo");
    console.log(thing1.things); //logs ["foo"]
    console.log(thing2.things); //logs []
    
    • object this

    Вы можете использовать this в любой функции объекта ссылаться на другие свойства этого объекта. Это не то же самое, что и экземпляр, созданный с помощью new.

    var obj = {
        foo: "bar",
        logFoo: function () {
            console.log(this.foo);
        }
    };
    
    obj.logFoo(); //logs "bar"
    
    • DOM event this

    В обработчике событий HTML DOM this всегда ссылается на элемент DOM, событие было присоединено к

    function Listener() {
        document.getElementById("foo").addEventListener("click",
           this.handleClick);
    }
    Listener.prototype.handleClick = function (event) {
        console.log(this); //logs "
    " } var listener = new Listener(); document.getElementById("foo").click();

    Если вы не bind контекст

    function Listener() {
        document.getElementById("foo").addEventListener("click", 
            this.handleClick.bind(this));
    }
    Listener.prototype.handleClick = function (event) {
        console.log(this); //logs Listener {handleClick: function}
    }
    
    var listener = new Listener();
    document.getElementById("foo").click();
    
    • HTML, этот

    Внутри атрибутов HTML, в которые вы можете поместить JavaScript, this является ссылкой на элемент.

    • eval this

    Вы можете использовать eval для доступа к this.

    function Thing () {
    }
    Thing.prototype.foo = "bar";
    Thing.prototype.logFoo = function () {
        eval("console.log(this.foo)"); //logs "bar"
    }
    
    var thing = new Thing();
    thing.logFoo();
    
    • с помощью этого

    Вы можете использовать with, чтобы добавить this в текущую область действия, чтобы читать и записывать значения на this, явно не ссылаясь на this.

    function Thing () {
    }
    Thing.prototype.foo = "bar";
    Thing.prototype.logFoo = function () {
        with (this) {
            console.log(foo);
            foo = "foo";
        }
    }
    
    var thing = new Thing();
    thing.logFoo(); // logs "bar"
    console.log(thing.foo); // logs "foo"
    
    • jQuery this

    jQuery во многих местах имеет this ссылается на элемент DOM.

0
задан Draken 13 July 2018 в 16:42
поделиться

2 ответа

Кажется, что вы думаете сделать что-то по этому поводу:

someMethod(...collect(Collectors.toList()));

Но вызывается только someMethod, если прошедший список не пуст, избегая при этом if операторов и временные переменные.

Материя факта. Невозможно предотвратить вызов метода в точке передачи данных.

Ваши варианты ограничены, и они выглядят следующим образом:

  1. Сохраните список во временную переменную перед вызовом someMethod, проверьте, есть ли !tempList.isEmpty(), и если это правда, то вызывать метод с этим списком ничего не делают.
  2. Выполняйте обработку как первое, что есть в someMethod, и немедленно выйдите из метода, если список пуст, используя return;, если это метод возврата void, иначе выкиньте исключение или верните некоторое значение, чтобы указать, что список не может быть обработан .
2
ответ дан Aomine 17 August 2018 в 12:34
поделиться
  • 1
    Если вопросник действительно установлен на исключении блоков if, может быть еще один свернутый параметр: Wrap ...collect(toList()) в Optional.of, а затем вызвать filter(list -> !list.isEmpty()).ifPresent(list -> someMethod(list)) ... хотя я бы не рекомендовал это. – Slaw 13 July 2018 в 16:51
  • 2
    @Slaw Хороший крик !. Это на самом деле умная идея, но может быть слишком умной для собственного блага. В конечном счете, если OP просто развлекается с этим, я полагаю, что нет никакого вреда в использовании этого подхода, но его следует избегать для создания кода, поскольку он теряет удобочитаемость, как вы намекали. – Aomine 13 July 2018 в 17:02
  • 3
    Производственный код * – Aomine 13 July 2018 в 17:09

Предполагая, что у вас есть следующие два метода:

private boolean canConsumeList(List<?> list) {
    return !list.isEmpty();
}

private <T> void consumeNonEmptyList(List<T> nonEmptyList) {
    // logic here
}

вы могли бы «взломать» API Collector следующим образом:

public final class ExtraCollectors {

    public static <T, R> Collector<T, ?, ?> collectingAndConsuming(Collector<T, ?, R> downstream, Predicate<R> resultFilter, Consumer<R> resultConsumer) {
        return Collectors.collectingAndThen(downstream, result -> {
            if (resultFilter.test(result)) {
                resultConsumer.accept(result);
            }
            return null;
        });
    }
}

, а затем использовать его следующим образом:

Stream.of("a", "b").collect(ExtraCollectors.collectingAndConsuming(
        Collectors.toList(), this::canConsumeList, this::consumeNonEmptyList
));

Обратите внимание, однако, что такое решение не является чем-то, что я считаю «чистым кодом» (поэтому я назвал его «хаком»). Это может быть неинтуитивно для других разработчиков, потому что collect сочетается с получением некоторого результата (или, другими словами, «собирая» элементы Stream в один результат). И здесь нет результата (даже моя IDE жалуется, что «результат Stream.collect() игнорируется»).

0
ответ дан Tomasz Linkowski 17 August 2018 в 12:34
поделиться
Другие вопросы по тегам:

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