Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Пятничный Best practices. / 25 сообщений из 76, страница 1 из 4
07.02.2014, 20:48
    #38554098
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничный Best practices.
Добрый день, коллеги!

Вот такой вот пятничный говнокодец.

Очень часто нужно сортировать сущности в коллекциях по разным колонкам.
В настоящий момент это уродство выглядит вот так.

Entity.java

Код: 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.
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;

public class FuckenEntity {

    private BigInteger account;
    private String clientName;
    private Date clientActivityDate;
    private String clientSubType;
    private BigDecimal clientBalance;

    public BigInteger getAccount() {
        return account;
    }

    public void setAccount(BigInteger account) {
        this.account = account;
    }

    public String getClientName() {
        return clientName;
    }

    public void setClientName(String clientName) {
        this.clientName = clientName;
    }

    public Date getClientActivityDate() {
        return clientActivityDate;
    }

    public void setClientActivityDate(Date clientActivityDate) {
        this.clientActivityDate = clientActivityDate;
    }

    public String getClientSubType() {
        return clientSubType;
    }

    public void setClientSubType(String clientSubType) {
        this.clientSubType = clientSubType;
    }

    public BigDecimal getClientBalance() {
        return clientBalance;
    }

    public void setClientBalance(BigDecimal clientBalance) {
        this.clientBalance = clientBalance;
    }
}



SortProcessor
Код: 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.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
import org.apache.log4j.Logger;
import org.springframework.beans.factory.BeanNameAware;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import static java.lang.String.format;
import static java.lang.String.format;

public class FuckenEntityProcessor implements BeanNameAware {

    private static Logger logger = Logger.getLogger(FuckenEntityProcessor.class);

    /**
     *
     * @param FuckenEntitys - fucken collection to sort (out)
     * @param nField - number of field (Just like SELECT .... FROM ... ORDER by nField )
     * @param direction - direction of sorting like { ASC | DESC }
     */
    public static void sort(List<FuckenEntity> FuckenEntitys, int nField, int direction) {
        if (direction == 0 || direction == 1) {
            if (FuckenEntitys != null && FuckenEntitys.size() > 0) {
                try {
                    if (nField == 0) {
                        Collections.sort(FuckenEntitys, new Comparator<FuckenEntity>() {
                            @Override
                            public int compare(FuckenEntity o1, FuckenEntity o2) {
                                if (o1.getAccount()==null && o2.getAccount()==null) return 0;
                                if (o1.getAccount()==null) return 1;
                                if (o2.getAccount()==null) return -1;
                                return o1.getAccount().compareTo(o2.getAccount());
                            }
                        });
                    } else if (nField == 1) {
                        Collections.sort(FuckenEntitys, new Comparator<FuckenEntity>() {
                            @Override
                            public int compare(FuckenEntity o1, FuckenEntity o2) {
                                if (o1.getClientName()==null && o2.getClientName()==null) return 0;
                                if (o1.getClientName()==null) return 1;
                                if (o2.getClientName()==null) return -1;
                                return o1.getClientName().compareTo(o2.getClientName());
                            }
                        });
                    } else if (nField == 2) {
                        Collections.sort(FuckenEntitys, new Comparator<FuckenEntity>() {
                            @Override
                            public int compare(FuckenEntity o1, FuckenEntity o2) {
                                if (o1.getClientActivityDate()==null && o2.getClientActivityDate()==null) return 0;
                                if (o1.getClientActivityDate()==null) return 1;
                                if (o2.getClientActivityDate()==null) return -1;
                                return o1.getClientActivityDate().compareTo(o2.getClientActivityDate());
                            }
                        });
                    } else if (nField == 3) {
                        Collections.sort(FuckenEntitys, new Comparator<FuckenEntity>() {
                            @Override
                            public int compare(FuckenEntity o1, FuckenEntity o2) {
                                if (o1.getClientSubType()==null && o2.getClientSubType()==null) return 0;
                                if (o1.getClientSubType()==null) return 1;
                                if (o2.getClientSubType()==null) return -1;
                                return o1.getClientSubType().compareTo(o2.getClientSubType());
                            }
                        });
                    } else if (nField == 4) {
                        Collections.sort(FuckenEntitys, new Comparator<FuckenEntity>() {
                            @Override
                            public int compare(FuckenEntity o1, FuckenEntity o2) {
                                if (o1.getClientBalance()==null && o2.getClientBalance()==null) return 0;
                                if (o1.getClientBalance()==null) return 1;
                                if (o2.getClientBalance()==null) return -1;
                                return o1.getClientBalance().compareTo(o2.getClientBalance());
                            }
                        });
                    }
                    if (direction==1) Collections.reverse(FuckenEntitys);
                } catch (Exception ex) {
                    logger.error(
                            format("Exception while sorting FuckenEntitys param = %d,dir = %d",
                                    nField, direction), ex
                    );
                }
            }
        }
    }

    ................
}



Обычно List<entity> связана 1:1 с GWT FlexTable и отображается на UI пользователя
как есть.

Сортировать на стороне источника данных не всегда возможно. Где БД - мы
как-то сортируем а вот из rest-сервисов приходится делать всё самим.

Встроенные DBMS (Derby, HyperSonic, H2) мы не используем.

Сами entities лежат в скоупе GWT компилляции и имеют поля только основных
примитивных типов (int, String, Date, BigDecimal). Сложные объекты
я пока не встречал.

Вопрос:

Как сортировать универсально?

Нужен какой-то компонент (SpringBean) которому на вход приходит
неизвестная коллекция List<Object> и номер колонки и direction (ASC|DESC)
по которой надо сортировать и на выходе мы имеет отсортированное.

Буду рад выслушать идеи, Best Practices и почитать исходники.

Спасибо!

P.S. Реверс тоже радует :)

P.P.S Фух. Написал таки. Пятница ... мать ее так.
...
Рейтинг: 0 / 0
07.02.2014, 20:56
    #38554102
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничный Best practices.
А reflection не спасет отца русской демократии?
Если нужна производительность, то что-то типа CGLIB

AFAIK & IMHO. Я бы в этом направлении делал, но осторожно, думая о производительности.
...
Рейтинг: 0 / 0
07.02.2014, 21:11
    #38554109
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничный Best practices.
Codegeneration меня точно спасёт. Не утонуть-бы...
...
Рейтинг: 0 / 0
07.02.2014, 21:32
    #38554125
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничный Best practices.
http://tips4java.wordpress.com/2008/10/23/bean-comparator/
говнокод, говнокодом, но тут ещё какой-то тупак с индексом поля. Кто придумал свойства через int адресовать?
В остальном, всё достаточно примитивно. Надо тупо избавиться от копипаста и станет более менне адекватно. Попробую изобразить.
...
Рейтинг: 0 / 0
07.02.2014, 21:53
    #38554141
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничный Best practices.
Код: 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.
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Processor {

    public static void sort(List<Entity> entities, final int nField, int direction) {
        Collections.sort(entities, new EntityComparator() {
            @Override
            Comparable get(Entity e) {
                switch (nField){
                    case 0: return e.getAccount();
                    case 1: return e.getClientName();
                    case 2: return e.getClientActivityDate();
                    case 3: return e.getClientSubType();
                    case 4: return e.getClientBalance();
                }
                throw new IllegalArgumentException("No field for index " + nField);
            }
        });
    }

    abstract static class EntityComparator implements Comparator<Entity> {
        @Override
        public int compare(Entity e1, Entity e2) {
            Comparable c1 = get(e1);
            Comparable c2 = get(e2);
            if (c1 == null && c2 == null) return 0;
            if (c1 == null) return 1;
            if (c2 == null) return -1;
            return c1.compareTo(c2);
        }

        abstract Comparable get(Entity e);
    }
}
...
Рейтинг: 0 / 0
07.02.2014, 21:58
    #38554144
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничный Best practices.
Blazkowicz,

блин, прогнал немного.
Код: 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.
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Processor {

    public static void sort(List<Entity> entities, final int nField, int direction) {
        Collections.sort(entities, new EntityComparator<Entity>() {
            @Override
            Comparable get(Entity e) {
                switch (nField){
                    case 0: return e.getAccount();
                    case 1: return e.getClientName();
                    case 2: return e.getClientActivityDate();
                    case 3: return e.getClientSubType();
                    case 4: return e.getClientBalance();
                }
                throw new IllegalArgumentException("No field for index " + nField);
            }
        });
    }

    abstract static class EntityComparator<T> implements Comparator<T> {
        @Override
        public int compare(T e1, T e2) {
            Comparable c1 = get(e1);
            Comparable c2 = get(e2);
            if (c1 == null && c2 == null) return 0;
            if (c1 == null) return 1;
            if (c2 == null) return -1;
            return c1.compareTo(c2);
        }

        abstract Comparable get(T e);
    }
}
...
Рейтинг: 0 / 0
07.02.2014, 22:42
    #38554157
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничный Best practices.
switch..case можно смело в саму entity унести
...
Рейтинг: 0 / 0
07.02.2014, 23:25
    #38554179
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничный Best practices.
О. Спасибо попробую. С entities такой трабл что компилируются они плагином gwt-maven-plugin
а с этим есть различные language limitations. Не всё что есть в Java компилируется в GWT.
...
Рейтинг: 0 / 0
08.02.2014, 22:00
    #38554652
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничный Best practices.
Blazkowicz
Код: java
1.
    abstract static class EntityComparator<T> implements Comparator<T> 


Рекомендую посмотреть Commons BeanUtils, там уже всё сделали (а именно BeanComparator)
http://commons.apache.org/proper/commons-beanutils/
...
Рейтинг: 0 / 0
08.02.2014, 22:41
    #38554682
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничный Best practices.
mayton ,
Если интересно сделать именно самому, то я бы смотрел банально в сторону рефлекшена и Unsafe:
Код: 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.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
public class Sorter {
    private static Unsafe UNSAFE = unsafe();

    public static <T> List<T> sort(List<T> src, Class cls, String fieldName, final SortOrder sortOrder)
        throws Exception {
        Field field = cls.getDeclaredField(fieldName);

        final FieldType type = fieldType(field);

        final long offset = UNSAFE.objectFieldOffset(field);

        Collections.sort(src, new Comparator<T>() {
         @Override public int compare(T o1, T o2) {
             switch (type) {
                 case INT:
                     return compareInt(o1, o2, offset, sortOrder);

                 // Все остальные примитивы.

                 default:
                     assert type == FieldType.OBJECT;

                     return compareObject(o1, o2, offset, sortOrder);
             }
         }
        });

        return src;
    }

    private static int compareInt(Object o1, Object o2, long offset, SortOrder sortOrder) {
        int val1 = UNSAFE.getInt(o1, offset);
        int val2 = UNSAFE.getInt(o1, offset);

        int res = val1 < val2 ? -1 : val1 == val2 ? 0 : 1;

        if (sortOrder == SortOrder.DESC)
            res = res * -1;

        return res;
    }

    // Все остальные примитивы.

    private static int compareObject(Object o1, Object o2, long offset, SortOrder sortOrder) {
        Object val1 = UNSAFE.getObject(o1, offset);
        Object val2 = UNSAFE.getObject(o1, offset);

        return applySortOrder(((Comparable)val1).compareTo(val2), sortOrder);
    }

    private static int applySortOrder(int res, SortOrder sortOrder) {
        return sortOrder == SortOrder.ASC ? res : res * -1;
    }


    private static FieldType fieldType(Field field) {
        // Тут определите тип поля.
        // TODO.
    }

    private static Unsafe unsafe() {
        try {
            Field f = Unsafe.class.getDeclaredField("theUnsafe");

            f.setAccessible(true);

            return (Unsafe)f.get(null);
        }
        catch (Exception e) {
            throw new RuntimeException("Failed to get Unsafe instance.");
        }
    }

    private static enum FieldType {
        INT,

        // Все стальные примитивы.

        OBJECT
    }
}

Разумеется, это только концепт, для демонстрации идеи. Для пущей няшности можно заморочиться, например, с аннотациями и кэшем дескрипторов конкретного класса. Например, фигачите на полях, по которым можно сортировать аннотацию Sortable. Потом, каким-нибудь образом регистрируете этот класс в сортировщике. Он проверяет консистентность. Например, что все reference поля реализуют Comparable. А потом кэширует дескриптор этого класса у себя. И когда вы будете вызывать непосредственно сортировку, то он просто вытащит дескриптор из кэша, быстро поймет, как именно надо обработать это поле, и все буде круто.

Ну и прочих фишек и оптимизаций уже сами нафигачите. Например, проверять SortType можно один раз на весь процесс сортировки, а не на каждом сравнении, как у меня. Можно передавать опциональный Comparator. И т.д..

Но вообще, как сказали выше, такое наверняка уже давным давно есть в каких-нибудь утилитарных библиотеках.
...
Рейтинг: 0 / 0
08.02.2014, 22:50
    #38554685
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничный Best practices.
Плюс можно, например, не создавать новый компаратор на каждый раз, а статически их создать и закэшировать. Например, по каждому типу и "направлению сортировки". Таким образом, у вас их будет штук эдак 18 (9 типов * 2 направления), зато GC Будет за вами меньше мусора собирать. Ну это уже совсем изврат, если прям все соки надо выжать
...
Рейтинг: 0 / 0
08.02.2014, 23:10
    #38554704
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничный Best practices.
Шняга какая-то, зачем рефлекшн.
Код: 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.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
    class Column<ENTITY, VALUE> {
        private final Getter<ENTITY, VALUE> getter;
        private final Comparator<VALUE>     comparator;

        public Getter<ENTITY, VALUE> getGetter() {
            return getter;
        }

        public Comparator<VALUE> getComparator() {
            return comparator;
        }

        Column(Getter<ENTITY, VALUE> getter, Comparator<VALUE> comparator) {
            this.getter = getter;
            this.comparator = comparator;
        }

        int compare(ENTITY e1, ENTITY e2) {
            return comparator.compare(getter.get(e1), getter.get(e2));
        }
                
    }

    static final Comparator<BigInteger> BIG_INT = new Comparator<BigInteger>() {
        @Override
        public int compare(BigInteger o1, BigInteger o2) {
            return o1.compareTo(o2);
        }
    };
    
    static final Comparator<String> STRING = new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return o1.compareTo(o2);
        }
    };

    interface Getter<ENTITY, T> {
        T get(ENTITY e);
    }

    class FuckenEntity {

        private BigInteger account;
        private String     clientName;

        public static final Getter<FuckenEntity, BigInteger> ACCOUNT = new Getter<FuckenEntity, BigInteger>() {
            @Override
            public BigInteger get(FuckenEntity e) {
                return e.account;
            }
        };

        public static final Getter<FuckenEntity, String> CLIENT_NAME = new Getter<FuckenEntity, String>() {
            @Override
            public String get(FuckenEntity e) {
                return e.clientName;
            }
        };
    }

    <E> void sort(final List<E> fuckenEntitys, final List<? extends Column> fuckenColumns) {

        Comparator<E> fuckenComparator = new Comparator<E>() {
            @Override
            public int compare(E o1, E o2) {
                for (Column column : fuckenColumns) {
                    int compare = column.compare(o1, o2);
                    if (compare != 0)
                        return compare;
                }
                return 0;
            }

            @Override
            public boolean equals(java.lang.Object obj) {
                return false;
            }
        };

        Collections.sort(fuckenEntitys, fuckenComparator);
    }

    
    void primer(List<FuckenEntity> list){
        Column<FuckenEntity, BigInteger> column1 = new Column<FuckenEntity, BigInteger>(FuckenEntity.ACCOUNT, BIG_INT);
        Column<FuckenEntity, String> column2 = new Column<FuckenEntity, String>(FuckenEntity.CLIENT_NAME, STRING);

        sort(list, Arrays.asList(column1, column2));
    }
...
Рейтинг: 0 / 0
09.02.2014, 00:20
    #38554745
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничный Best practices.
cdtyjvПлюс можно, например, не создавать новый компаратор на каждый раз, а статически их создать и закэшировать. Например, по каждому типу и "направлению сортировки". Таким образом, у вас их будет штук эдак 18 (9 типов * 2 направления), зато GC Будет за вами меньше мусора собирать. Ну это уже совсем изврат, если прям все соки надо выжать
Это тема. +1
Я думаю что нам нужен пул компараторов. У нас в коде штук 200 интерфейсов и на каждый есть
1 FlexTable c 5-10 колонками сортировок. Тоесть грубо говоря нам надо 200 * 5 = 1000 компараторов.
...
Рейтинг: 0 / 0
09.02.2014, 10:38
    #38554843
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничный Best practices.
ivanraРекомендую посмотреть Commons BeanUtils, там уже всё сделали (а именно BeanComparator)
http://commons.apache.org/proper/commons-beanutils/
Мне не нужно ничего рекомендовать, я вопросов не задавал. BeanComparator работает на рефлексии. Мой код - нет. Я просто отрефакторил то что привел mayton
...
Рейтинг: 0 / 0
09.02.2014, 10:42
    #38554844
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничный Best practices.
maytonЭто тема. +1
Я думаю что нам нужен пул компараторов. У нас в коде штук 200 интерфейсов и на каждый есть
1 FlexTable c 5-10 колонками сортировок. Тоесть грубо говоря нам надо 200 * 5 = 1000 компараторов.
Сортировка клиентская или серверная? В любом случае зачем пул, если на сервере компаратор быстро издохнет в молодом поколении, а на клиенте никто не будет так часто и постоянно сортировать все возможные интерфейсы.
...
Рейтинг: 0 / 0
09.02.2014, 10:43
    #38554845
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничный Best practices.
Лагман,
А зачем столько новых бестолковых Comparator для типов, которы уже реализуют Comparable?
...
Рейтинг: 0 / 0
09.02.2014, 11:29
    #38554861
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничный Best practices.
Лагман, y нас есть необходимость сортировать также null значения.
...
Рейтинг: 0 / 0
09.02.2014, 12:42
    #38554882
HoBTID
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничный Best practices.
mayton,
А так ли нужен вам List<FuckenEntity> ?
Не подойдет ли List<List<Comparable>>, т.е. матрица свойств обектов, вместо списка обектов.

Ну и можно класс отдельный создать Matrix<T extends Comparable>,
который будет еще и описания колонок внутри себя хранить.
...
Рейтинг: 0 / 0
09.02.2014, 12:44
    #38554884
HoBTID
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничный Best practices.
HoBTIDMatrix<T extends Comparable>
Не так, правильнее Matrix<? extends Comparable>
...
Рейтинг: 0 / 0
09.02.2014, 13:08
    #38554892
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничный Best practices.
BlazkowiczBeanComparator работает на рефлексии. Мой код - нет. Я просто отрефакторил то что привел mayton
Все так, но доступ к геттерам в BeanComparator кешируется, так что расходы на рефлексию (в большой коллекции, либо при многократной сорировке) сводятся к вызову этих геттеров, что сравнимо по производительности с работой через интерфейсы. Поэтому BeanComparator не такой уж и медленный, как кажется на первый взгляд.
Конечно, хардкод будет самый быстрый, но можно ли это считать Best practices?
...
Рейтинг: 0 / 0
09.02.2014, 14:23
    #38554932
Monochromatique
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничный Best practices.
В каком кошмаре живут явисты.

https://code.google.com/p/lambdaj/
...
Рейтинг: 0 / 0
09.02.2014, 15:25
    #38554955
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничный Best practices.
MonochromatiqueВ каком кошмаре живут явисты.

https://code.google.com/p/lambdaj/

Иди из нашего кошмара в свой- установки MS серверов и совместимости версия дотнета :)
...
Рейтинг: 0 / 0
09.02.2014, 15:30
    #38554960
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничный Best practices.
MonochromatiqueВ каком кошмаре живут явисты.

https://code.google.com/p/lambdaj/ Надежда на Java 8 .
...
Рейтинг: 0 / 0
09.02.2014, 15:31
    #38554962
Monochromatique
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничный Best practices.
Alexey TominMonochromatiqueВ каком кошмаре живут явисты.

https://code.google.com/p/lambdaj/

Иди из нашего кошмара в свой- установки MS серверов и совместимости версия дотнета :)

Да как бы нет проблем. ))


Но как-то хотелось думать (не приведи Бог столкнуться), что в JAVA есть эквивалент - persons.OrderBy(p=>p.name)

На что я кстати и привел ссылку. Просто ты наверное не понял.
...
Рейтинг: 0 / 0
09.02.2014, 17:41
    #38555003
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничный Best practices.
MonochromatiqueAlexey Tominпропущено...
Иди из нашего кошмара в свой- установки MS серверов и совместимости версия дотнета :)

Да как бы нет проблем. ))

Но как-то хотелось думать (не приведи Бог столкнуться), что в JAVA есть эквивалент - persons.OrderBy(p=>p.name)


Будет в JDK8

MonochromatiqueНа что я кстати и привел ссылку. Просто ты наверное не понял.

Я не понял, что ты этим хотел сказать, да :)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Пятничный Best practices. / 25 сообщений из 76, страница 1 из 4
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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