Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / чот я туплю. как избавиться от фора. / 24 сообщений из 24, страница 1 из 1
10.08.2020, 20:45
    #39988402
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чот я туплю. как избавиться от фора.
в общем, никак не воткну как в джаве это нормально сделать.. не хочу использовать древний фор.

есть класс который возвращает объект самого себя ну типа:

something.attribute("A").then().attribute("B").then().attribute("c").closeWith("D");

причем something.attribute("A").then() возвращает объект класса Something
а something.attribute("A") возвращает объект класса SomethingClosable

есть list аттрибутов где хранятся эти A, B, C, D, E

собссно вопрос как через стрим или что-то такое разложить это чтоб было так --
на входе массив (лист) с абцде, а на выходе объект что свыше, и обязательно с закрытием?

окей, это вообще через стримы джавовские можно разложить или только фор или какая-нибудь рекурсия?
...
Рейтинг: 0 / 0
10.08.2020, 20:49
    #39988406
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чот я туплю. как избавиться от фора.
andreykaT,

Поток слов какой-то.
Нарисуй кейс классы и сигнатуру метода
...
Рейтинг: 0 / 0
10.08.2020, 22:49
    #39988437
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чот я туплю. как избавиться от фора.
Предположительно это
- рекурсия
- функциональшина
- правила вывода

Но нужно чтоб автор модульный тест нарисовал. С четким входом и выходом.

Меньше слов. Больше кода.
...
Рейтинг: 0 / 0
11.08.2020, 01:21
    #39988460
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чот я туплю. как избавиться от фора.
andreykaT
не хочу использовать древний фор



эхех.. не хочу учиться, хочу жениться )))


andreykaT
something.attribute("A").then().attribute("B").then().attribute("c").closeWith("D");


это называется fluent interface , какое отношение вообще имеет к старому.. ладно-ладно, _древнему_ доброму фору?


andreykaT
собссно вопрос как через стрим или что-то такое разложить это чтоб было так --
на входе массив (лист) с абцде, а на выходе объект что свыше, и обязательно с закрытием?


map/filter/collect? не?
...
Рейтинг: 0 / 0
11.08.2020, 08:47
    #39988491
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чот я туплю. как избавиться от фора.
andreykaT

на входе массив (лист) с абцде, а на выходе объект что свыше, и обязательно с закрытием?

окей, это вообще через стримы джавовские можно разложить или только фор или какая-нибудь рекурсия?


Не истины ради, а флейма для.

Сделал на Kotlin.
Только не придумал, как "всунуть" "closeWith" :-)

<:o)

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
open class Attribute(val name: String) {
    override fun toString(): String {
        return "Attribute(name='$name')"
    }
}

class A:Attribute("A")
class B:Attribute("B")
class C:Attribute("C")
class D:Attribute("D")
class E:Attribute("E")

val list: Array<Attribute> = arrayOf(A(),B(),C(),D(),E())


open class Something(
    val a: A? ,
    val b: B?,
    val c: C?,
    val d: D?,
    val e: E?
) {
    fun attribute(attribute: Attribute): SomethingClosable =
        when(attribute) {
            is A -> SomethingClosable( a = attribute, b = this.b, c = this.c, d = this.d, e = this.e  )
            is B -> SomethingClosable( a = this.a, b = attribute, c = this.c, d = this.d, e = this.e  )
            is C -> SomethingClosable( a = this.a, b = this.b, c = attribute, d = this.d, e = this.e  )
            is D -> SomethingClosable( a = this.a, b = this.b, c = this.c, d = attribute, e = this.e  )
            is E -> SomethingClosable( a = this.a, b = this.b, c = this.c, d = this.d, e = attribute  )
            else -> throw Exception("Unknown attribute")
        }



    override fun toString(): String {
        return "Something(a=$a, b=$b, c=$c, d=$d, e=$e)"
    }


}

class SomethingClosable(a:A?, b:B?, c:C?, d:D?, e:E?): Something(a,b,c,d,e) {
    fun then(): Something =
        Something(a,b,c,d,e)

    fun closeWith(attr: Attribute): SomethingClosable =
        attribute(attr)
}

fun main(args: Array<String>) {

    val result = list.fold(Something(null,null,null,null,null)){ acc: Something, attribute:Attribute  ->
        acc.attribute(attribute).then()
    }

    println(result)

}
...
Рейтинг: 0 / 0
11.08.2020, 18:03
    #39988725
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чот я туплю. как избавиться от фора.
hVostt
andreykaT
не хочу использовать древний фор



эхех.. не хочу учиться, хочу жениться )))


andreykaT
something.attribute("A").then().attribute("B").then().attribute("c").closeWith("D");


это называется fluent interface , какое отношение вообще имеет к старому.. ладно-ладно, _древнему_ доброму фору?


andreykaT
собссно вопрос как через стрим или что-то такое разложить это чтоб было так --
на входе массив (лист) с абцде, а на выходе объект что свыше, и обязательно с закрытием?


map/filter/collect? не?

да. ты прав. из списка должен сконструироваться объект построенный на классе имплементирующем флюентинтерфейс.

самое банальное чего в джаве нет но вроде есть в листутилзах:

на входе:
List(1,3,5,6)

а на выходе это:
list.add(1).add(3).add(5).add(6).close()

нужно сделать БЕЗ фора. через стримы коллекторы и т.п.
...
Рейтинг: 0 / 0
11.08.2020, 18:05
    #39988726
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чот я туплю. как избавиться от фора.
andreykaT
hVostt
пропущено...



эхех.. не хочу учиться, хочу жениться )))


пропущено...


это называется fluent interface , какое отношение вообще имеет к старому.. ладно-ладно, _древнему_ доброму фору?


пропущено...


map/filter/collect? не?

да. ты прав. из списка должен сконструироваться объект построенный на классе имплементирующем флюентинтерфейс.

самое банальное чего в джаве нет но вроде есть в листутилзах:

на входе:
List(1,3,5,6)

а на выходе это:
list.add(1).add(3).add(5).add(6).close()

нужно сделать БЕЗ фора. через стримы коллекторы и т.п.


fold чем не устраивает?
...
Рейтинг: 0 / 0
11.08.2020, 20:02
    #39988751
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чот я туплю. как избавиться от фора.
в джавастримах искаропки есть фолд?
...
Рейтинг: 0 / 0
11.08.2020, 20:07
    #39988757
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чот я туплю. как избавиться от фора.
andreykaT
в джавастримах искаропки есть фолд?

Не знаю, должен быть какой нибудь reduce как минимум
...
Рейтинг: 0 / 0
11.08.2020, 22:05
    #39988778
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чот я туплю. как избавиться от фора.
редьюс это не фолд. он на выходе требует тип равный типу элемента стрима.
...
Рейтинг: 0 / 0
11.08.2020, 22:08
    #39988779
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чот я туплю. как избавиться от фора.
я так подозреваю что коллект может быть похожим. но это не точно.
...
Рейтинг: 0 / 0
11.08.2020, 22:21
    #39988783
SpringMan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чот я туплю. как избавиться от фора.
andreykaT
редьюс это не фолд. он на выходе требует тип равный типу элемента стрима.

В джавовских стримах есть оба (и с тем же типом, и с новым). По сути можно как-то так:
Код: java
1.
2.
        Something reduce = Arrays.asList(1, 2, 3, 4, 5).stream()
                .reduce(new Something(), (s, i) -> s.attribute(i).then(), (s1, s2) -> null);


Если надо часто делать и с закрытием, то можно и свой коллектор бахнуть
...
Рейтинг: 0 / 0
13.08.2020, 22:26
    #39989580
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чот я туплю. как избавиться от фора.
блин. и как ты это делаешь?

у меня продолжение...

есть инпут:

String a = "apple|banana+potato+carrot-tomato"

происходит магия стримов и получается аутпут:

f.bool().must("apple")
.must("banana")
.should("potato")
.should("carrot")
.mustNot("tomato")

как сделать с фором индексом и кучей ифов вроде понятно. а как сделать по-человечески?
...
Рейтинг: 0 / 0
13.08.2020, 22:55
    #39989590
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чот я туплю. как избавиться от фора.
andreykaT
как сделать с фором индексом и кучей ифов вроде понятно.


А почему вы считаете, что это не по-человечески?

На деле когда вагон абстракций затаскивают там, где нужен простой фор, получается какаха.
И вёдры слёз, кому это поддерживать.
...
Рейтинг: 0 / 0
13.08.2020, 23:05
    #39989597
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чот я туплю. как избавиться от фора.
Мне кажется, форы как раз и нечитаемы. А разложить процесс на стримы с мапами флатмапами редусами и коллектами каунтами и тп вот это то что надо) но это мое мнение
Как то так вышло что я наверное форов в проще написал меньше чем пальцев на двух руках
...
Рейтинг: 0 / 0
13.08.2020, 23:16
    #39989602
SpringMan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чот я туплю. как избавиться от фора.
Если есть стремление к функциональщине, то можно посмотреть что-то типа такого. Но боюсь, на практике, для удобства сопровождения - циклы наше все.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
package org.test;

import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
import java.util.regex.Pattern;

public class BananaPsvm {

    public static void main(String[] args) {
        var str = "apple|banana+potato+carrot-tomato";
        var result = Pattern.compile("(\\W)?(\\w+)")
                .matcher(str)
                .results()
                .reduce(new Builder(), (b, value) -> b.action(value.group(1), value.group(2)), (b1, b2) -> null)
                .finalResult;
        System.out.println(result);
    }

    public static class Builder {
        public String finalResult = "";

        private Map<String, Function<String, Builder>> actions = new HashMap<>() {{
            put("|", (value) -> must(value));
            put("+", (value) -> should(value));
            put("-", (value) -> mustNot(value));
        }};

        public Builder must(String value) {
            finalResult += "must: " + value + "; ";
            return this;
        }

        public Builder should(String value) {
            finalResult += "should: " + value + "; ";
            return this;
        }

        public Builder mustNot(String value) {
            finalResult += "mustNot: " + value + "; ";
            return this;
        }

        public Builder action(String sign, String value) {
            return actions.getOrDefault(sign, this::must).apply(value);
        }
    }
}

...
Рейтинг: 0 / 0
14.08.2020, 01:18
    #39989625
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чот я туплю. как избавиться от фора.
Задача как обычно описана в терминах юнца, первый раз покупающего презерватив.
Но судя по тому что я понял, это обычный парсер, причем парсер с состоянием, поэтому если хочется оставаться функциональным то тут применяется монада State, но блин в java?? Серьезно? либо не выеб..ться и нагуглить любой способ реализации парсера, тот же рекурсивный спуск. Хотя если нет вложенности можно на обычном foldMap заимплементить
...
Рейтинг: 0 / 0
14.08.2020, 10:49
    #39989705
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чот я туплю. как избавиться от фора.
используй goto, вместо устаревшего for'а
...
Рейтинг: 0 / 0
14.08.2020, 11:16
    #39989715
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чот я туплю. как избавиться от фора.
andreykaT
Мне кажется, форы как раз и нечитаемы. А разложить процесс на стримы с мапами флатмапами редусами и коллектами каунтами и тп вот это то что надо) но это мое мнение
Как то так вышло что я наверное форов в проще написал меньше чем пальцев на двух руках
да. У тебя склонность к функциональщине. Увы.
Сам решай. Ищи нишу)))
...
Рейтинг: 0 / 0
14.08.2020, 11:16
    #39989716
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чот я туплю. как избавиться от фора.
Roman Mejtes
используй goto, вместо устаревшего for'а
+5)))))
...
Рейтинг: 0 / 0
15.08.2020, 19:08
    #39990095
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чот я туплю. как избавиться от фора.
Где-то нам лет 10 назад чел подогнал исходник "Пентамино". Где goto был очень даже кстати.
Я отдельным челенджем подниму пятничный топик на тему рефакторинга этого кода.
...
Рейтинг: 0 / 0
15.08.2020, 20:52
    #39990120
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чот я туплю. как избавиться от фора.
Roman Mejtes
используй goto, вместо устаревшего for'а

гото - это долбаные ивенты. особенно синхронные.
...
Рейтинг: 0 / 0
15.08.2020, 20:54
    #39990123
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чот я туплю. как избавиться от фора.
goto - прекрасен. Без него не будет ассемблера. Но нам это уже неактуально.
...
Рейтинг: 0 / 0
15.08.2020, 21:04
    #39990128
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чот я туплю. как избавиться от фора.
SpringMan
Если есть стремление к функциональщине, то можно посмотреть что-то типа такого. Но боюсь, на практике, для удобства сопровождения - циклы наше все.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
package org.test;

import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
import java.util.regex.Pattern;

public class BananaPsvm {

    public static void main(String[] args) {
        var str = "apple|banana+potato+carrot-tomato";
        var result = Pattern.compile("(\\W)?(\\w+)")
                .matcher(str)
                .results()
                .reduce(new Builder(), (b, value) -> b.action(value.group(1), value.group(2)), (b1, b2) -> null)
                .finalResult;
        System.out.println(result);
    }

    public static class Builder {
        public String finalResult = "";

        private Map<String, Function<String, Builder>> actions = new HashMap<>() {{
            put("|", (value) -> must(value));
            put("+", (value) -> should(value));
            put("-", (value) -> mustNot(value));
        }};

        public Builder must(String value) {
            finalResult += "must: " + value + "; ";
            return this;
        }

        public Builder should(String value) {
            finalResult += "should: " + value + "; ";
            return this;
        }

        public Builder mustNot(String value) {
            finalResult += "mustNot: " + value + "; ";
            return this;
        }

        public Builder action(String sign, String value) {
            return actions.getOrDefault(sign, this::must).apply(value);
        }
    }
}



спсибо, бро. ты единственный кто открыл мне глаза и сказал что редьюз это не только х,у->х+у
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / чот я туплю. как избавиться от фора. / 24 сообщений из 24, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]