Здесь я вижу две проблемы. Во-первых, tableGrob
является функцией для создания grob из data.frame. Но вы уже создали свою таблицу, вам не нужна эта функция. Но ggtexttable
возвращает объект ggplot, но вам нужен grob, поэтому вам нужно использовать ggplotGrob
, чтобы превратить этот объект ggplot в то, что вы можете использовать с annotation_custom
.
Вторая проблема заключается в том, диапазон, определенный для ваших значений x. Поскольку ваши данные отформатированы как вектор даты, эти значения сохраняются как количество дней с 1970-01-01, поэтому значения 1.5 и 1.8 находятся вне диапазона того, что вы на самом деле рисуете. Вы можете видеть свой фактический диапазон с помощью
range(as.numeric((HUC_df1$stdate)))
# [1] 11296 11298
. Таким образом, устраняя эти две проблемы, вы хотите, чтобы этот пример был
HUC1+annotation_custom(ggplotGrob(HUC1_table), xmin=11296,
xmax=11298,
ymin=200, ymax=300)
Вы также можете попробовать:
listOfClassB.stream().map(ClassB::getAnotherObjList).flatMap(List::stream).count();
Это очень лаконично и элегантно. Если ClassB::getAnotherObjList
не возвращает слишком много элементов, производительность не будет проблемой.
long totalSum = listOfClassB.stream()
.mapToInt(elem -> elem.getAnotherObjList().size())
.sum();
Я думаю, что результатом суммирования является long
, так как несколько целых чисел могут пройти значение max int; вы всегда можете разыграть его, если уверены, что это не приведет к переполнению.
Это не совсем одна строка, по крайней мере, как отформатировано выше, но, возможно, он вписывается в одном выражении.
Если case и element в первом списке имеют значение null или если getAnotherObjList () возвращает значение null, вы можете поддержать это, отфильтровав эти случаи:
long totalSum = listOfClassB.stream()
.filter(Objects::nonNull)
.map(ClassB::getAnotherObjList)
.filter(Objects::nonNull)
.mapToInt(List::size)
.sum();
Другой способ с использованием коллекторов:
int totalNo = listOfClassB.stream()
.collect(Collectors.summingInt(classB -> classB.getAnotherObjList().size()));
Эквивалентный способ, только со ссылками на метод:
int totalNo = listOfClassB.stream()
.collect(Collectors.mapping(
ClassB::getAnotherObjList,
Collectors.summingInt(List::size)));
Или отображение в потоке, а не в коллекторе:
int totalNo = listOfClassB.stream()
.map(ClassB::getAnotherObjList)
.collect(Collectors.summingInt(List::size));