Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему в Set-е нету get-а? 
:(
    Опции темы
Shklyar
Дата 16.7.2018, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Почему в Set-е нету get-а?
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Се ля ви
Дата 16.7.2018, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 8
Всего: 127



Индексации нет, порядку тоже нет. Что бы ты хотел, что бы такой метод выдавал? 


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
Shklyar
Дата 17.7.2018, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Хотел бы по получить obj, который eq, приблизительно, как в Map получают значение.

Встретил ситуацию, когда часть обьекта определяет уникальность и ее легко повторить, а другая часть хранит дополнительные полезные данные, которые нужно получить. Можно проитерироваться, но пропадает вся прелесть хоть какой реализации Set.

Это сообщение отредактировал(а) Shklyar - 17.7.2018, 08:40
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
LSD
Дата 17.7.2018, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15708
Регистрация: 24.3.2004

Репутация: 209
Всего: 537



Цитата(Shklyar @  17.7.2018,  02:15 Найти цитируемый пост)
Встретил ситуацию, когда часть обьекта определяет уникальность и ее легко повторить, а другая часть хранит дополнительные полезные данные, которые нужно получить.

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

Ключ по которому ищут объект должен быть immutable, а вот вторая часть которая "хранит дополнительные полезные данные" явно выглядит как mutable часть. Получается, что ты создаешь объект пустышку заполненный наполовину, только для того чтобы использовать его как ключ. В данной ситуации лучше разделить объект на две части: key part и value part и использовать композицию, и соответственно данные хранить в Map.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Се ля ви
Дата 17.7.2018, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 8
Всего: 127



Довольно специфический функционал и вообще - это не корректное использование eq, IMHO (так что соглашусь с LSD)...
Но, как говориться, если нельзя, но очень хочется... smile))

В общем, если сильно нужно - добавь сам. smile
Java, конечно, не Groovy, не Kotlin и тем более не Scala, что бы поддерживать из коробки extension-method`ы, но могу предложить два довольно корявых, но способа:Я тут накидал пару JUnit 5 - тестиков для того, что бы и то и другое продемонстрировать.
Для начала нам нужны зависимости на JUnit5, AssertJ (что бы делать проверки) и Lombok (без него, как, впрочем, и без Vavr`а, я уже давно - как без рук):
  • в Gradle (тестировал на версии 4.9, если что),
    Код
        compileOnly 'org.projectlombok:lombok:+'
        testCompile 'org.junit.jupiter:junit-jupiter-params:+',
                        'org.assertj:assertj-core:+'
        testRuntime 'org.junit.jupiter:junit-jupiter-engine:+'
        // To avoid compiler warnings about @API annotations in JUnit code
        testCompileOnly 'org.apiguardian:apiguardian-api:+'
    Сорри, что не Kotlin - они пока в стабильную не вышли, брезгую, хотя и на "холодном старте", так сказать.
  • , или, на худой конец, в Maven`е (тут уж придётся быть многословным и жертвовать лаконичностью):
    Код
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>LATEST</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter-params</artifactId>
                <version>LATEST</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.assertj</groupId>
                <artifactId>assertj-core</artifactId>
                <version>LATEST</version>
                <scope>test</scope>
            </dependency>
    , ну и, если нет Spring Boot`а, то Maven`у нужно выставлять специальные настройки в плагинах что бы он Java 10 использовал и JUnit 5 гонял:
    Код
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>10</java.version>
            <maven.compiler.source>${java.version}</maven.compiler.source>
            <maven.compiler.target>${java.version}</maven.compiler.target>
            <junit.platform.version>1.3.0-M1</junit.platform.version>
        </properties>
        <build>
            <plugins>

                <!-- COMPILER (Java10+ and lombok compatible) -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.7.0</version>
                    <configuration>
                        <source>${java.version}</source>
                        <target>${java.version}</target>
                        <compilerArgs>
                            <arg>-parameters</arg>
                        </compilerArgs>
                    </configuration>
                    <dependencies>
                        <dependency>
                            <groupId>org.ow2.asm</groupId>
                            <artifactId>asm</artifactId>
                            <version>6.2</version>
                        </dependency>
                    </dependencies>
                </plugin>

                <!-- SUREFIRE (compatible with JUnit 5+, Java 9+, Lombok) -->
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.22.0</version>
                    <configuration>
                        <argLine>--add-modules java.se.ee</argLine>
                        <includes>
                            <include>**/Test*.java</include>
                            <include>**/*Test.java</include>
                            <include>**/*Tests.java</include>
                            <include>**/*TestCase.java</include>
                        </includes>
                        <properties>
                            <!--<includeTags>fast</includeTags>-->
                            <excludeTags>slow</excludeTags>
                            <!--<configurationParameters>-->
                                <!--junit.jupiter.conditions.deactivate = *-->
                            <!--</configurationParameters>-->
                        </properties>
                    </configuration>
                    <dependencies>
                        <dependency>
                            <groupId>org.junit.platform</groupId>
                            <artifactId>junit-platform-surefire-provider</artifactId>
                            <version>${junit.platform.version}</version>
                        </dependency>
                    </dependencies>
                </plugin>

            </plugins>
        </build>
Если при этом захочется компилировать средствами IDE, а не build-tool`а, то нужно поставить галочку "Enable Annotation Processing" в настройках компиляции (В IDEA это File -> Settings -> Build, Execution, Deployment -> Compiler -> Annotation Processors -> Enable Annotation Processing).
Ну и, что бы среда разработки лишний раз не ругалась на Lombok, желательно установить Lombok plugin. Правда, от всего это не спасёт - например, функционал @ExtensionMethod`а он не поддерживает - issue 21 до сих пор открыто :((( Так что придётся либо мириться с "краснотой" в IDE и code-review tool`е, либо использовать пока только первый способ.

Итак, для начала нам нужен объект, по которому будем тестировать:
Код
@Value
@EqualsAndHashCode(exclude = "y")
class Obj {
    int x;
    int y;
}

(Если в друг нет опыта с Lombok`ом, эти аннотации заставят перед компиляцией:
  • вставить "private final" перед каждым полем
  • вставить конструктор со всеми полями-аргументами, который будет их инициализировать
  • вставить типовую реализацию всего стандартного барахла - getter`ов для всех полей, equals`а, hashCode`а, toString`а
  • в методе equals при этом не будет ни коим образом учитываться поле "y"
)
Итак, приступим. Первый вариант - использование неявной типизации при помощи ключевого слова var, появившегося в Java 10 (приём, известный как "Ad-Hock Methods" описан Николаем Парлогом тут):
Код
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import static org.assertj.core.api.Assertions.assertThat;

class AddingMethodByVarKeywordTest {

    @Test
    @DisplayName("\"get\"-method correctly adds to HashSet by var keyword")
    void testAddMethodGetToSetByVarKeyword() {
        // given
        var mySet = new HashSet<Obj>() {
            public Optional<Obj> get(Obj obj) {
                return stream()
                        .filter(t -> t.equals(obj))
                        .findAny();
            }
        };
        mySet.addAll(
                Set.of(new Obj(1, 2),
                        new Obj(2, 3),
                        new Obj(3, 4)));

        // when
        Optional<Obj> stringOptional = mySet.get(new Obj(1, 4));

        // then
        assertThat(stringOptional)
                .isPresent()
                .hasValue(new Obj(1, 2));
    }
}
Тут неудобство, разумеется, в том, что определять объект коллекции с этим самым методом, можно только в том же самом блоке (или его подблоке), что и код, использующий этот самый метод get - неявный тип передать явно в другой метод не получится :(((((( (если я правильно понял, это станет возможным в Java 11, но только для лямбд, но может быть, понял я не правильно - тему особо не копал)

Второй способ - через экспериментальную аннотацию @ExtensionMethod annotation-processor`а Lombok:
  • тут нам сначала нужно сделать утильный класс с методом, который в качестве первого параметра принимает Set - его мы и будем вставлять:
    Код
    @UtilityClass
    class SetExtensions {
        public <T> Optional<T> get(Set<T> tSet, T t) {
            return tSet.stream()
                    .filter(t2 -> t2.equals(t))
                    .findAny();
        }
    }
  • теперь можем писать основной тест:
    Код
    @ExtensionMethod(SetExtensions.class)
    public class AddingMethodByExtensionMethodLomboksAnnotationTest {

        @Test
        @DisplayName("\"get\"-method correctly adds to HashSet by Lombok`s ExtensionMethod annotation")
        void testAddMethodGetToSetByExtensionMethodLomboksAnnotation() {
            // given
            val mySet = Set.of(new Obj(1, 2), new Obj(2, 3), new Obj(3, 4));

            // when
            Optional<Obj> stringOptional = mySet.get(new Obj(1, 4));

            // then
            assertThat(stringOptional)
                    .isPresent()
                    .hasValue(new Obj(1, 2));
        }
    }
Тут основной недостаток - что этот самый метод get помечается IDE как несуществующий.
У меня все тесты проходят.
Надеюсь, разъяснил. Демо-проект (в варианте с Gradle`ом) выложил на GitHub`е.


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
Shklyar
Дата 17.7.2018, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Цитата(LSD @  17.7.2018,  11:15 Найти цитируемый пост)
Тоже задавался таким вопросом, и пришел к выводу что такое использование Set это плохая практика.

Обьекты приходят снаружи, с зависимости. Раньше они были собраны в сет - видимо задумано им быть уникальными. Ранее достаточно было (и было) контейнс, но вот понадобилось посмотреть на обьект, который контейнс.
Пришел к Map<T, T>


Цитата(LSD @  17.7.2018,  11:15 Найти цитируемый пост)
Ключ по которому ищут объект должен быть immutable, а вот вторая часть которая "хранит дополнительные полезные данные" явно выглядит как mutable часть.

Цитата
Note: great care must be exercised if mutable objects are used as set keys.
The behavior of a set is not specified if the value of an object is changed in a manner that affects equals comparisons while the object is a key in the set.



Цитата(LSD @  17.7.2018,  11:15 Найти цитируемый пост)
лучше разделить объект на две части: key part и value part и использовать композицию, и соответственно данные хранить в Map.

Интересная конструкция.
Исходя из HotSpot имплементации Set, посчитал что получу свой поиск без дополнительных затрат перейдя на Map. 


Се ля ви, ого, почитаю.
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Shklyar
Дата 18.7.2018, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Цитата(Се ля ви @  17.7.2018,  15:05 Найти цитируемый пост)
Но, как говориться, если нельзя, но очень хочется... ))
В общем, если сильно нужно - добавь сам. 

Спасибо, есть с чем поиграться.
Да, очень хочется, но не добавить, а взять. Где-то слышал, что самый надежный код - тот что не написан.
Ну а если б хотелось написать, скорее б это был утилитный для сета класс.

Посмотрел я метод get - а как там используется встроенный в Set алгоритм поиска?)
И еще одно ПОЧЕМУ: почему метод сета add возвращает boolean?


Цитата(LSD @  17.7.2018,  11:15 Найти цитируемый пост)
композицию, и хранить в Map

Забыл добавить, что такая конструкция понравилась как предохранитель, когда в будущем по неосторожности кто-то захочет что-то сломать.
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Се ля ви
Дата 19.7.2018, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 8
Всего: 127



Цитата(Shklyar @  18.7.2018,  12:34 Найти цитируемый пост)
метод get - а как там используется встроенный в Set алгоритм поиска?)

Никак, я по-простому накидал через монаду - просто что бы работало. Реализуй как надо - я же показывал исключительно как цеплять метод.

Цитата(Shklyar @  18.7.2018,  12:34 Найти цитируемый пост)
если б хотелось написать, скорее б это был утилитный для сета класс.

Так по сути это и есть второй мной описанный вариант - класс-то утильный с методом get отдельный и выносить можно куда угодно.

Цитата(Shklyar @  18.7.2018,  12:34 Найти цитируемый пост)
почему метод сета add возвращает boolean?

Потому что в Set`е может уже быть этот объект - и это значит, что добавить (не удалив) его туда не получится. При чём определяется это по методам equals и hashCode, так что в твоём случае "странного" использования equals`а, это значит, что если там есть какой-то объект, который eq с тем, который ты пытаешься положить - ты его туда не положишь. Можно их, конечно, развести по hashCode`ам, но тогда ты теряешь преимущества того самого "встроенного в Set алгоритма поиска".


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
Shklyar
Дата 19.7.2018, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Цитата(Се ля ви @  19.7.2018,  15:23 Найти цитируемый пост)
в твоём случае "странного" использования equals`а,

Не в моем. Вот посмотрел, и рад бы поругаться, да все тут ок.

Цитата(Се ля ви @  19.7.2018,  15:23 Найти цитируемый пост)
Потому что в Set`е может уже быть этот объект - и это значит, что добавить (не удалив) его туда не получится.

Почему в мапе пут возврашает E?

Цитата(Се ля ви @  19.7.2018,  15:23 Найти цитируемый пост)
Так по сути это и есть второй мной описанный вариант

Про Lombok интересен такой вопрос: какие проблемы ты встречал или видишь системными? Слышал мнение, что кто-то долго парился с тем, что натворил Lombok. Я особо не встречал, максимум цикличность, которая детектится с первого раза.

Цитата(Се ля ви @  19.7.2018,  15:23 Найти цитируемый пост)
Реализуй как надо

Как надо, пока, по моим представлениям, не получится.
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Се ля ви
Дата 20.7.2018, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 8
Всего: 127



Цитата(Shklyar @  19.7.2018,  23:32 Найти цитируемый пост)
Цитата(Се ля ви @  19.7.2018,  15:23 )
в твоём случае "странного" использования equals`а,

Не в моем. Вот посмотрел, и рад бы поругаться, да все тут ок.

equals - это проверка на эквивалентность, т.е. с т.з. предметной области - эти объекты - полные аналоги друг друга. То, что туда не обязаны входить все поля, означает, что они не значимы. Я сегодня могу одеть синюю майку, а завтра красную - но это всё равно останусь я и equals меня в синей майке со мной в красной должен выдавать true. Так же и тут - не вхождение полей в проверку по equals`у означает лишь то, что эти поля не являются идентифицирующими и не важны с т.з. предметной области задачи, но ожидания у програмиста, когда он видит, что два объекта equals именно такие - что это по сути один и тот же объект, просто в силу особенностей алгоритма решаемой задачи оказавшийся скопированным в различные области памяти.

Цитата(Shklyar @  19.7.2018,  23:32 Найти цитируемый пост)
Почему в мапе пут возврашает E?

Это просто удобно, это т.н. pipeline-стиль написания кода. В Java он известен давно по классам StringBuilder/Buffer, но действительно активно применяется, начиная с Java 8 в Stream`ах, CompletableFuture`ах, Optional`ах - тебе нужно что-то сделать с объектом, но перед этим необходимо положить его в мапу по какому-то ключу. Если бы этого поведения не было, то ты кладёшь объект в мапу одной операцией, и только второй делаешь с ним то, что нужно - в итоге у тебя две операции вместо одной со всем сопутствующим гемороем - блок придётся ставить, если это в лямбде, внутри цикла или if`а, в тернарный оператор не воткнёшь... Очень громоздкий код получается и увеличивается количество точек, где можно совершить ошибку.

Цитата(Shklyar @  19.7.2018,  23:32 Найти цитируемый пост)
Про Lombok интересен такой вопрос: какие проблемы ты встречал или видишь системными? Слышал мнение, что кто-то долго парился с тем, что натворил Lombok. Я особо не встречал, максимум цикличность, которая детектится с первого раза.

Lombok - это не магия! Он простой, как топор и делает с твоим кодом совершенно очевидные, элементарные вещи по устранению boilerplate-кода (т.е. такого кода, за которым не стоит принятия решений, а он является тавтологией и его приходится писать просто из-за того, что язык этого требует). Уже достаточно давно был сформулирован принцип борьбы с таким кодом, который получил название "Convention over Configuration" ("Соглашения по конфикурации"), которому мы обязаны прогрессу в Computer Science последние лет 15, поскольку большинство новых разработок в Java-мире - Spring, Maven, Gradle, Lombok, Vavr, а так же языки и инструменты, проектировались в соответствии с этим принципом.

Главное правило использования Lombok`а - как только тебе кажется, что Lombok делает что-то непонятное для тебя - применяешь действие "delombok" и смотришь, во что Lombok превратил твой код, пока не поймёшь. Большую часть деломбока вообще берёт на себя плагин к идее (просто кликаешь правой кнопкой мыши на классе и выбираешь Refactor -> Delombok -> {имя интересующей аннотации или "All lombok annotations" для всех}), но если аннотации в этом списке нет, можно использовать мавеновский плагин, вот моя конфигурация:
Код
<!-- LOMBOK -->
            <plugin>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok-maven-plugin</artifactId>
                <version>1.18.0.0</version>
                <executions>
                    <execution>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>delombok</goal>
                        </goals>
                        <configuration>
                            <addOutputDirectory>false</addOutputDirectory>
                            <sourceDirectory>src/main/java</sourceDirectory>
                        </configuration>
                    </execution>
                    <execution>
                        <id>test-delombok</id>
                        <phase>generate-test-sources</phase>
                        <goals>
                            <goal>testDelombok</goal>
                        </goals>
                        <configuration>
                            <addOutputDirectory>false</addOutputDirectory>
                            <sourceDirectory>src/test/java</sourceDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
Там точно раскрывается всё, что нужно. Твой знакомый, видимо, просто не знал про такую простую операцию.
Посмотри доклад Цикура, он там конечно далеко не про всё рассказывает, но для начала сойдёт - https://youtu.be/VGewqN_x0oQ

Что касается недостатков, они, опять же, сейчас (начиная с 10-й Java) теперь присущи и ей самой - это связано с т.н. "type inference" - когда ты вместо типа пишешь в простой Java var, а с lombok`ом - val. Дело в том, что с т.з. читабельности кода для человека это допустимо только в ситуации, когда из правой части выражения очевидна левая. Часто этим злоупотребляют и пишут val/var даже в тех случаях, когда при чтении кода непонятен выводимый из контекста тип переменной. Этого надо избегать. Один из разработчиков Java`ы Стюарт Маркс написал на этот счёт огромедную текстину, но если подытоживать, то практика должна быть такой:
Используйте val/var только если верен хотя бы один пункт из списка:
  • в правой части выражения вызывается конструктор, например 
    Код
    val x = new MyClass();
  • в правой части вызываается Builder, например 
    Код
    val x = MyClass.builder().x(1).y(2).build();
    val y = MyClass.newInstance();
  • в правой части вызывается метод, из названия которого очевиден (!) тип, например 
    Код
    val c = DriverManager.getConnection(url, props);
    val s = c.createStatement();
  • переменная в левой части называется так же, как тип, только с маленькой буквы, например 
    Код
    val connection = ...;
  • переменная в левой части названа так, что предполагает (!) определённый тип, например 
    Код
    val dob = ...; // Date of birth, так что тип, очевидно, LocalDate или Date, а что именно - должно быть понятно из контекста
    val name = ...; // Чем может быть имя, кроме строки?
    val size = ...; // Тут либо int, либо long, а что именно - должно быть понятно из контекста
При соблюдении этих правил проблем не возникает.

Лично я только благодаря Lombok`у и Vavr`у в принципе способен ещё писать на Java, от которой без них меня уже просто тошнит. Если бы ты изучил другие языки JVM, типа Groovy, Kotlin`а и тем более Scala`ы, у тебя - поверь - было бы то же самое.
И - да, в продакшене я и многие мои коллеги его использовал, использую и, конечно, буду использовать, пока на Java приходится писать. Работаю я старшим разработчиком в EPAM`е, если что - можешь на меня ссылаться.


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
Shklyar
Дата 20.7.2018, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Цитата(Се ля ви @  20.7.2018,  13:34 Найти цитируемый пост)
>> Почему в мапе пут возврашает E?
Это просто удобно, это т.н. pipeline-стиль написания кода.

Цитата
Returns:
the previous value associated with key, or null if there was no mapping for key.

--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Се ля ви
Дата 20.7.2018, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 8
Всего: 127



Цитата(Shklyar @  20.7.2018,  15:04 Найти цитируемый пост)
previous value associated with key, or null if there was no mapping for key.

Мда, ошибочка вышла... Я бы на месте разработчиков сделал бы по-другому.
Ну тогда не так удобно, как могло бы.

Добавлено через 3 минуты и 56 секунд
Вообще, на коллекции в Java море критики - у того же Одерского (автор Scala`ы) - почему они с нуля свою библиотеку коллекций написали. Да и в Java многие активно юзают свои библиотеки коллекций - Guava, GoldmanSachs, Apache, Trove... тут поглядеть можно.


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
Shklyar
Дата 20.7.2018, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: 2
Всего: 3



Цитата(Се ля ви @  20.7.2018,  14:14 Найти цитируемый пост)
Я бы на месте разработчиков сделал бы по-другому.

Собственно, да, ответы на мои почему нашел: потому что так сделали.
Но было увлекательно поковырять про редко используемые особенности.

--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
rfq
Дата 17.8.2018, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 20.3.2007

Репутация: нет
Всего: нет



Цитата(Shklyar @ 16.7.2018,  23:52)
Почему в Set-е нету get-а?

если посмотреть на `Set<T>` как на `Map` (в котором есть `get()`), то это `Map<T, boolean>`. То есть, подаем объект и в качестве ответа получаем - входит такой объект во множество или нет.
Так что метод `get()` в `Set` есть, только называется он `contains()`.
PM MAIL   Вверх
_zorn_
Дата 17.8.2018, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: нет
Всего: 12



А вот можно опять насрать на яву ?
Вот буквально сегодня надо было быстренько из с++ в qml данные передать. Я уж начал задумываться - это же писец, типы классы и вот это вот все создавать (воздействие явы на мозг). 
Но нет посмотрел на свой старый код и QVariantHash меня спас.
Тупо 
Код

QVariantHash  map;
QVariant value = BLABLABLA
map["theKey"] = value;
return map


И из qml 
Цитата
label.text = result.theKey


Ну и нахрена эти сложности со сранным приведением типа ? И утил для конвертации ?

Добавлено через 5 минут и 31 секунду
Вот только не надо мне гнать что в вашем ынтерпрайзе нету архитектурных ошибок. В итоге вы боритесь с мельницами на ровном месте.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1951 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.